証明書・CSR・秘密鍵がペアかどうかを確認する方法

CSRと証明書に含まれる公開鍵と秘密鍵がペアとなっているかどうかは、**Modulus**値が一致しているかを確認することで判断することができます。
**Modulus**値が一致していれば公開鍵と秘密鍵がペアであるといえます。
（**Modulus**値は、ざっくり言うと公開鍵・秘密鍵の積です。）

# 1. 自己証明書作成
まずは確認用として、自己証明書を作成します。

### 1.1. 秘密鍵作成
以下のコマンドで秘密鍵を作成します。
`openssl genrsa -out <秘密鍵ファイル> <bit長>`

```:実行結果
[root@centos8 test]# openssl genrsa -out server.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..+++++
...................................................+++++
e is 65537 (0x010001)
[root@centos8 test]#
```
### 1.2. CSR作成
以下のコマンドでCSRを作成します。
`openssl req -new -key <秘密鍵ファイル> -out <CSRファイル>`

```:実行結果
[root@centos8 test]# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Kanagawa
Locality Name (eg, city) [Default City]:Yokohama
Organization Name (eg, company) [Default Company Ltd]:yasushi-jp
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:yasushi-jp.co.jp
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos8 test]#
```

### 1.3. 証明書作成
以下のコマンドでCSRに自己署名し、証明書を作成します。
`openssl x509 -req -days <有効日数> -signkey <秘密鍵ファイル> -in <CSRファイル> -out <証明書ファイル>`

```:実行結果
[root@centos8 test]# openssl x509 -req -days 3650 -signkey server.key -in server.csr -out server.crt
Signature ok
subject=C = JP, ST = Kanagawa, L = Yokohama, O = yasushi-jp, CN = yasushi-jp.co.jp
Getting Private key
[root@centos8 test]# ls
server.crt  server.csr  server.key
[root@centos8 test]#
```

# 2. Modulus値の確認
以下の秘密鍵、CSR、証明書のファイルのModulus値を確認してみます。
+ server.key（秘密鍵）
+ server.csr（CSR）
+ server.crt（証明書）

```:実行結果
[root@centos8 test]# ls
server.crt  server.csr  server.key
[root@centos8 test]#
```

### 2.1. 秘密鍵のModulus値の確認
以下のコマンドで秘密鍵のModulus値を確認できます。 
`openssl rsa -noout -modulus -in <秘密鍵ファイル>`

```:実行結果
[root@centos8 test]# openssl rsa -noout -modulus -in server.key
Modulus=D5A7F6670076DC5F22FE31936E8677B774DFC33448F8E4F65F637F8ECED022BD1EFEE3D2CCFAC2475F718DB0C766F66B7E664BFFD1E85486FAC5718B3B7F725966DE21D0D92AD18D7DBB868858ADF5880614F888DED0DF2E6B9FA334619817A5A28E4C74B77CC3F37C35C1979BC09BB240FFC966055819A20FFE03F4FE266EB9E742097811F9CCD881211C644BA38908B50208E79CCCE15FBBB0318FB10624D232E4325833CFD936E4B36B4A73BA7208C0CCA3388D3B340C4B964C39CEA68623A03D6522ABB3CF5FD82EC2416D1DC2C7281EBC1FC6A3E6EE563C2A687C5CB54870DDB64B6705556817A16859B3D891D2161A618AEA12F5CE643ACEB30390B05F
[root@centos8 test]#
```

### 2.2. CSRのModulus値の確認 
以下のコマンドでCSRのModulus値を確認できます。 
`openssl req -noout -modulus -in <CSRファイル>`

```:実行結果
[root@centos8 test]# openssl req -noout -modulus -in server.csr
Modulus=D5A7F6670076DC5F22FE31936E8677B774DFC33448F8E4F65F637F8ECED022BD1EFEE3D2CCFAC2475F718DB0C766F66B7E664BFFD1E85486FAC5718B3B7F725966DE21D0D92AD18D7DBB868858ADF5880614F888DED0DF2E6B9FA334619817A5A28E4C74B77CC3F37C35C1979BC09BB240FFC966055819A20FFE03F4FE266EB9E742097811F9CCD881211C644BA38908B50208E79CCCE15FBBB0318FB10624D232E4325833CFD936E4B36B4A73BA7208C0CCA3388D3B340C4B964C39CEA68623A03D6522ABB3CF5FD82EC2416D1DC2C7281EBC1FC6A3E6EE563C2A687C5CB54870DDB64B6705556817A16859B3D891D2161A618AEA12F5CE643ACEB30390B05F
[root@centos8 test]#
```
### 2.3. 証明書のModulus値の確認 
以下のコマンドで証明書のModulus値を確認できます。 
`openssl x509 -noout -modulus -in <証明書ファイル>`

```:実行結果
[root@centos8 test]# openssl x509 -noout -modulus -in server.crt
Modulus=D5A7F6670076DC5F22FE31936E8677B774DFC33448F8E4F65F637F8ECED022BD1EFEE3D2CCFAC2475F718DB0C766F66B7E664BFFD1E85486FAC5718B3B7F725966DE21D0D92AD18D7DBB868858ADF5880614F888DED0DF2E6B9FA334619817A5A28E4C74B77CC3F37C35C1979BC09BB240FFC966055819A20FFE03F4FE266EB9E742097811F9CCD881211C644BA38908B50208E79CCCE15FBBB0318FB10624D232E4325833CFD936E4B36B4A73BA7208C0CCA3388D3B340C4B964C39CEA68623A03D6522ABB3CF5FD82EC2416D1DC2C7281EBC1FC6A3E6EE563C2A687C5CB54870DDB64B6705556817A16859B3D891D2161A618AEA12F5CE643ACEB30390B05F
[root@centos8 test]#
```

# 3. Modulus値のMD5ハッシュ値確認
証明書・CSR・秘密鍵がペアとなっているかどうかのみを確認する場合、Modulus値は長いので、Modulus値のmd5ハッシュ値で比較するとよいでしょう。

### 3.1. 秘密鍵のModulus値のmd5ハッシュ値確認
以下のコマンドで秘密鍵のModulus値のmd5ハッシュ値を確認できます。 
`openssl rsa -noout -modulus -in <秘密鍵ファイル> | openssl md5`

```:実行結果
[root@centos8 test]# openssl rsa -noout -modulus -in server.key | openssl md5
(stdin)= b409e6a842be8f78535d2cc96db64935
[root@centos8 test]#
```

### 3.2. CSRのModulus値のmd5ハッシュ値確認 
以下のコマンドでCSRのModulus値のmd5ハッシュ値を確認できます。 
`openssl req -noout -modulus -in <CSRファイル> | openssl md5`

```:実行結果
[root@centos8 test]# openssl req -noout -modulus -in server.csr | openssl md5
(stdin)= b409e6a842be8f78535d2cc96db64935
[root@centos8 test]#
```

### 3.3. 証明書のModulus値のmd5ハッシュ値確認 
以下のコマンドで証明書のModulus値のmd5ハッシュ値を確認できます。 
`openssl x509 -noout -modulus -in <証明書ファイル> | openssl md5`

```:実行結果
[root@centos8 test]# openssl x509 -noout -modulus -in server.crt | openssl md5
(stdin)= b409e6a842be8f78535d2cc96db64935
[root@centos8 test]#
```
---
以上