前回,OpenSSLでCAを構築しました。そのCAからユーザ証明書を発行してみましょう。ユーザ証明書の発行は次の,2パターンの方法があります。
1.CAが鍵ペアを生成して,証明書を発行する。
2.鍵ペアはユーザが作成して,CAはユーザからもらった公開鍵に署名をつける。
それでは順番にユーザ証明書を発行していってみましょう。
CAが鍵ペアを生成して,証明書を発行する
これはCAがPKCS#12ファイルを作成して,ユーザに配布するパターンです。PKCS#12ファイルはパスワードで暗号化されていますので,PKCS#12ファイルとパスワードをユーザに配布する必要があります。この2つは,別々のルートで配布します。
例えば,PKCS#12ファイルを添付して,メール本文にパスワードを書いて送った場合,メールを盗聴されてしまうと,鍵ペアと証明書が取得されてしまいます。メールでファイルを添付したら,パスワードは電話で通知するなどの措置を取ります。
それではユーザ用証明書を発行していきます。
手順としては,次のようになります。
(1)証明書リクエストファイルを生成する。
(2)公開鍵に署名をする。
(3)PKCS#12ファイルを生成する。
(1)証明書リクエストファイルを生成する
コマンドプロンプトから「CA.pl -newreq」を実行します。
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -newreq
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -newreq Generating a 2048 bit RSA private key ......+++ .......+++ writing new private key to 'newkey.pem' Enter PEM pass phrase: # ← newkey.pemファイルのパスワードを設定 Verifying - Enter PEM pass phrase: # ← newkey.pemファイルのパスワードの確認入力 ----- 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) [AU]:JP # ← 国名を入れる State or Province Name (full name) [Some-State]:Tokyo # ← 県名を入れる Locality Name (eg, city) []:Edogawa # ← 町の名前を入れる Organization Name (eg, company) [Internet Widgits Pty Ltd]:Trusted Design # ← 会社名を入れる Organizational Unit Name (eg, section) []:CertUsers # ← ユーザグループ名を入れる Common Name (e.g. server FQDN or YOUR name) []:user1 # ← ユーザ名を入れる Email Address []:user1@trusted-design.net # ← メールアドレスを入れる Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: # ← 何も入れずにリターン An optional company name []: # ← 何も入れずにリターン Request is in newreq.pem, private key is in newkey.pem
(2)公開鍵に署名をする
(1)で生成した証明書リクエストファイルにCAの秘密鍵で署名をします。CAが署名をすることで証明書が生成されます。
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -sign
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -sign Using configuration from C:\OpenSSL-Win32\bin\openssl.cfg Enter pass phrase for ./demoCA/private/cakey.pem: # ← CA生成時に入力したCA秘密鍵のパスワードを入力 Check that the request matches the signature Signature ok Certificate Details: Serial Number: c3:b0:ac:cb:99:9b:d8:db Validity Not Before: Mar 19 22:35:27 2016 GMT Not After : Mar 19 22:35:27 2036 GMT Subject: countryName = JP stateOrProvinceName = Tokyo localityName = Edogawa organizationName = Trusted Design organizationalUnitName = CertUsers commonName = user1 emailAddress = user1@trusted-design.net X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 2B:72:8F:AD:C4:3F:27:38:A1:0D:5F:07:0E:37:00:29:72:CF:C6:18 X509v3 Authority Key Identifier: keyid:D0:59:65:97:90:8C:DA:A2:EC:5F:79:94:4C:AF:5E:94:FB:C1:B2:23 Certificate is to be certified until Mar 19 22:35:27 2036 GMT (7305 days) Sign the certificate? [y/n]:y # ← yでリターン 1 out of 1 certificate requests certified, commit? [y/n]y # ← yでリターン Write out database with 1 new entries Data Base Updated Signed certificate is in newcert.pem
(3)PKCS#12ファイルを生成する
myCAのフォルダを見ると[newreq.pem][newcert.pem][newkey.pem]の3つのファイルが生成されています。この3つのファイルは今までの手順で作成した,ユーザの証明書リクエストファイル,証明書ファイル,秘密鍵ファイルです。PKCS#12ファイルを生成するためには,このうちの証明書ファイルと,秘密鍵ファイルが必要です。この2つのファイルをパッケージ化するとPKCS#12ファイルになるのです。
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -pkcs12
C:\myCA>perl C:\OpenSSL-Win32\bin\CA.pl -pkcs12 Enter pass phrase for newkey.pem: # ← 上で入力したnewkey.pemのパスワードを入力 Enter Export Password: # ← PKCS#12ファイルのパスワードを設定 Verifying - Enter Export Password: # ← PKCS#12ファイルのパスワードを確認入力 PKCS #12 file is in newcert.p12
鍵ペアはユーザが作成して,CAはユーザからもらった証明書に署名をつける
鍵ペアはユーザが作成して,CAはユーザからもらった証明書に署名をつけるパターンは,上のパターンの「(1)証明書リクエストファイルを生成する」をユーザのPCで実行することになります。ユーザからの証明書リクエストファイル「newreq.pem」を見ると,次のようなファイルになっています。
-----BEGIN CERTIFICATE REQUEST----- MIIC2zCCAcMCAQAwgZUxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIDAVUb2t5bzEQMA4G A1UEBwwHRWRvZ2F3YTEXMBUGA1UECgwOVHJ1c3RlZCBEZXNpZ24xEjAQBgNVBAsM CUNlcnRVc2VyczEOMAwGA1UEAwwFdXNlcjExJzAlBgkqhkiG9w0BCQEWGHVzZXIx QHRydXN0ZWQtZGVzaWduLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAMA1knTWQfLAaNgxKcFbAOPyit/iPvxV5BRv4jMoohz/twqRerL29cxR9NFn AwVMZCKRB+BposvuJA8AbbNGjIHWesBg4mxmQEBgVfvZz5we0ViNCzSfoglDn/KN xGGX1TRaITfjTucue84dy0v41UnlOgRBQvukhyH37dDgG6C3jflcV45aLNsY7TqE slmbDp/+goGnOkw5Gxf3RYBBKxcp+ZgpwGU3TWMEXWwJTeaQi6fsUuU3etAcuScq V1jozpC8cmlOG35VtuDQGIoFPvB17T1WLpwwQ166LIZBsjYl3F6G3UQ9L2ZUXIc5 3R3T7hZHYHrLte9ientWfmZq1SUCAwEAAaAAMA0GCSqGSIb3DQEBCwUAA4IBAQC1 8oGM1S5aIdcW3VTGgde2PDZaoOD+e6gy3IR8wErGpynuT+AkRSPa5abPY6+npnDZ A4o/ZDltPwmy2baobKj2DvQmZEKnQqwwH7OpNrdXp/P2BK/FXm0lcZloTk5sbX2u V4eWjzpld3qnFxWZ1ybg3vJCoWcYUK/Y3BCkhF/gjjKxBsOAxw492XcuckoxDt8u 9g4Q6d9GDIf4kiAvK5ile8DUGtv7iacrHorjrEm0Hh6sIN1EuF/WJNw6kcFK7z/E bLHiwjqOc2s6TIANVdrNf8WpsPQqcwFOtFGI6R7HxkrVvkzlY89ZCtuKGtL79rF+ UEJv8QW5gc+uELuOnY2X -----END CERTIFICATE REQUEST-----
これが証明書リクエストファイル(CSR)と言われるもので,PKCS#8の形式になっていると,普通のCAなら受け取ることができます。このファイルをCAに渡して署名してもらうと,ユーザ証明書の出来上がりです。