OpenSSLの1.0.1~1.0.1f、1.0.2-beta~1.0.2-beta1について脆弱性が確認されています。
対象となるバージョンを利用されている場合には、早急にアップデートもしくはHearbeatオプションを除外してリコンパイルしましょう。
鍵ファイル、パスワードは再発行しましょう。
JPCERT
OpenSSLを利用してPKI環境を構築する。
Linuxはubuntu12.04を利用。本稿記述時点でのバージョンは1.0.1
[ubuntu@pki]$ openssl OpenSSL> version OpenSSL 1.0.1 14 Mar 2012
公開鍵の方式を利用して、アクセス対象の真正性を保証し、通信を行う仕組み。らしい。
厳密な定義はよくわかりません。
IPAの記事などを
読んでおかなきゃとおもいつつ、読めてません。
#これだけ!
[ubuntu@pki ~]$ sudo apt-get update [ubuntu@pki ~]$ sudo apt-get install openssl
秘密鍵を作成する。
openssl genrsa -out key.pem [暗号化方式] [ビット長] 暗号化方式は -des -des3 -aes128 -aes192 -aes256 など
秘密鍵に対応した署名要求を作成する。
openssl req [-config conffile] -new -key key.pem -out req.pem
CSRにサインして、証明書を作成する。
openssl ca [-config conffile] -in req.pem -out crt.pem
秘密鍵とCSRを同時に作成することも可能
openssl req -new -newkey rsa:1024 -keyout key.pem -out req.pem
既存の秘密鍵を利用し、CSRを作成せずに自己署名証明書を生成する。
openssl req -new -key key.pem -x509 -days 365 -out crt.pem
新規の秘密鍵を生成し、CSRを作成せずに自己署名証明書を生成する。
openssl req -new -newkey rsa:1024 -keyout key.pem -x509 -days 365 -out crt.pem
秘密鍵からパスフレーズを削除する場合
openssl rsa -in serverkey.pem -out serverkey.pem
再度署名しようとしても、エラーでできない場合は、一旦無効化する必要がある。
openssl ca -revoke ./newcerts/cert.pem
証明書から不要な情報(Certificate:~~)を除去
openssl x509 -in crt.pem -out crt.pem
証明書からバイナリ形式作成
openssl x509 -inform pem -in crt.pem -outform der -out crt.der
秘密鍵は秘密のフォルダに移動し、誰にも見られないようにする。
mkdir private mv key.pem private chmod 400 key.pem
それぞれの用途に合わせてファイルを作成しておく
[ubuntu@pki ~/ssl]$ mkdir configs [ubuntu@pki ~/ssl]$ cd configs
[ubuntu@pki ~/ssl/configs]$ vi openssl_req.cnf [ req ] distinguished_name = req_distinguished_name [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = JP stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = 0.organizationName = Organization Name (eg, company) 0.organizationName_default = organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = commonName = Common Name (e.g. server FQDN or YOUR name) commonName_max = 64 commonName_default =
[ubuntu@pki ~/ssl/configs]$ vi openssl_sign.cnf [ ca ] default_ca = CA_default [ CA_default ] dir = ./ certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/crl.pem RANDFILE = $dir/private/.rand name_opt = ca_default cert_opt = ca_default default_days = 365 default_crl_days= 30 default_md = default preserve = no policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ v3_ca ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints=CA:true keyUsage = cRLSign,keyCertSign [ v3_server ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ v3_client ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth
/ssl/rcaに作成するものとする。
[ubuntu@pki ~ssl]$ mkdir ~/ssl/rca [ubuntu@pki ~ssl]$ cd ~/ssl/rca
[ubuntu@pki ~rca]$ mkdir newcerts [ubuntu@pki ~rca]$ mkdir private [ubuntu@pki ~rca]$ echo "01" > serial [ubuntu@pki ~rca]$ echo "00" > crlnumber [ubuntu@pki ~rca]$ touch index.txt
[ubuntu@pki ~rca]$ openssl genrsa -out private/rcakey.pem -aes256 2048 Generating RSA private key, 2048 bit long modulus .......................................+++ ......................+++ e is 65537 (0x10001) Enter pass phrase for private/rcakey.pem: Verifying - Enter pass phrase for private/rcakey.pem: [ubuntu@pki ~rca]$
[ubuntu@pki ~rca]$ openssl req -config ../configs/openssl_req.cnf -new -key private/rcakey.pem -out rcacsr.pem Enter pass phrase for private/rcakey.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) [JP]:JP State or Province Name (full name) []:Tokyo Organization Name (eg, company) []:Prosper2 Organizational Unit Name (eg, section) []:Root CA Common Name (e.g. server FQDN or YOUR name) []:Prosper2 Root CA [ubuntu@pki ~rca]$
単純にCSRを作成するだけで、「CAの」CSRといっているわけではない。次の手順でCA用にサインしているだけだ。
[ubuntu@pki ~rca]$ openssl ca -config ../configs/openssl_sign.cnf -keyfile private/rcakey.pem -batch -days 30 -selfsign -extensions v3_ca -in rcacsr.pem -out rcacrt.pem Using configuration from ../configs/openssl_sign.cnf Enter pass phrase for private/rcakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Jul 12 06:45:08 2013 GMT Not After : Aug 11 06:45:08 2013 GMT Subject: countryName = JP stateOrProvinceName = tokyo organizationName = Prosper2 organizationalUnitName = Root CA commonName = Prosper2 Root CA X509v3 extensions: X509v3 Subject Key Identifier: FE:43:F1:2D:83:87:EC:3E:A4:38:93:69:69:64:2E:2B:EB:97:9D:F3 X509v3 Authority Key Identifier: keyid:FE:43:F1:2D:83:87:EC:3E:A4:38:93:69:69:64:2E:2B:EB:97:9D:F3 X509v3 Basic Constraints: CA:TRUE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment Certificate is to be certified until Aug 11 06:45:08 2013 GMT (30 days) Write out database with 1 new entries Data Base Updated [ubuntu@pki ~rca]$
[ubuntu@pki ~rca]$ openssl x509 -inform PEM -outform DER -in rcacrt.pem -out rcacrt.der [ubuntu@pki ~rca]$
[ubuntu@pki ~rca]$ openssl ca -config ../configs/openssl_sign.cnf -revoke newcerts/03.pem -keyfile private/rcakey.pem -cert rcacrt.pem
/ssl/icaに作成するものとする。
[ubuntu@pki ~ssl]$ mkdir ~/ssl/ica [ubuntu@pki ~ssl]$ cd ~/ssl/ica
[ubuntu@pki ~ica]$ mkdir newcerts [ubuntu@pki ~ica]$ mkdir private [ubuntu@pki ~ica]$ echo "01" > serial [ubuntu@pki ~ica]$ echo "00" > crlnumber [ubuntu@pki ~ica]$ touch index.txt
[ubuntu@pki ~ica]$ openssl genrsa -out private/icakey.pem -aes256 2048 Generating RSA private key, 2048 bit long modulus ............................................+++ ........+++ e is 65537 (0x10001) Enter pass phrase for private/icakey.pem: Verifying - Enter pass phrase for private/icakey.pem: [ubuntu@pki ~ica]$
[ubuntu@pki ~ica]$ openssl req -config ../configs/openssl_req.cnf -new -key private/icakey.pem -out icacsr.pem Enter pass phrase for private/icakey.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) [JP]:JP State or Province Name (full name) []:tokyo Organization Name (eg, company) []:Prosper2 Organizational Unit Name (eg, section) []:Intermediate CA Common Name (e.g. server FQDN or YOUR name) []:Prosper2 Intermediate CA [ubuntu@pki ~ica]$
[ubuntu@pki ~ica]$ cp icacsr.pem ../rca
[ubuntu@pki ~ica]$ cd ../rca [ubuntu@pki ~rca]$ openssl ca -config ../configs/openssl_sign.cnf -keyfile private/rcakey.pem -batch -days 30 -cert rcacrt.pem -extensions v3_ca -in icacsr.pem -out icacrt.pem Using configuration from ../configs/openssl_sign.cnf Enter pass phrase for private/rcakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 2 (0x2) Validity Not Before: Jul 12 07:59:56 2013 GMT Not After : Jul 12 07:59:56 2014 GMT Subject: countryName = JP stateOrProvinceName = tokyo organizationName = Prosper2 organizationalUnitName = Intermediate CA commonName = Prosper2 Intermediate CA X509v3 extensions: X509v3 Subject Key Identifier: 23:54:A3:BD:73:BA:A5:37:FB:B7:40:25:5A:2A:56:84:99:8B:B1:79 X509v3 Authority Key Identifier: keyid:B1:0F:66:B2:40:FD:F4:3E:12:31:03:E6:C7:2B:BE:C6:3A:1A:CB:03 X509v3 Basic Constraints: CA:TRUE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment Certificate is to be certified until Jul 12 07:59:56 2014 GMT (365 days) Write out database with 1 new entries Data Base Updated [ubuntu@pki ~rca]$ cp icacrt.pem ../ica [ubuntu@pki ~rca]$ cd ../ica
[ubuntu@pki ~ica]$ openssl x509 -inform PEM -outform DER -in icacrt.pem -out icacrt.der [ubuntu@pki ~ica]$
apacheを利用して、サーバ認証とクライアント認証を実施する。
サーバにルートCAから発行されたサーバ証明書を配置、クライアントに中間CAから発行されたクライアント証明書を配置し、正常に通信が行えるかを確認する。
/ssl/websvに作成するものとする。
[ubuntu@pki ~ssl]$ mkdir ~/ssl/websv [ubuntu@pki ~ssl]$ cd ~/ssl/websv
[ubuntu@pki ~websv]$ mkdir private
[ubuntu@pki ~websv]$ openssl req -config ../configs/openssl_req.cnf -new -newkey rsa:2048 -keyout private/websvkey.pem -out websvcsr.pem Generating a 2048 bit RSA private key ..+++ ................................................................+++ writing new private key to 'private/websvkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [JP]:JP State or Province Name (full name) []:tokyo Organization Name (eg, company) []:Prosper2 Organizational Unit Name (eg, section) []:web server Common Name (e.g. server FQDN or YOUR name) []:websv.prosper2.org [ubuntu@pki ~websv]$
[ubuntu@pki ~websv]$ openssl rsa -in private/websvkey.pem -out private/websvkey.pem Enter pass phrase for private/websvkey.pem: writing RSA key [ubuntu@pki ~websv]$
[ubuntu@pki ~websv]$ cp websvcsr.pem ../rca
[ubuntu@pki ~websv]$ cd ../rca [ubuntu@pki ~rca]$ openssl ca -config ../configs/openssl_sign.cnf -keyfile private/rcakey.pem -batch -days 30 -cert rcacrt.pem -extensions v3_server -in websvcsr.pem -out websvcrt.pem Using configuration from ../configs/openssl_sign.cnf Enter pass phrase for private/rcakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 3 (0x3) Validity Not Before: Jul 12 23:49:27 2013 GMT Not After : Aug 11 23:49:27 2013 GMT Subject: countryName = JP stateOrProvinceName = tokyo organizationName = Prosper2 organizationalUnitName = web server commonName = websv.prosper2.org X509v3 extensions: X509v3 Subject Key Identifier: 5E:25:4E:08:B5:8E:42:EA:6C:4E:64:8E:1A:18:F5:5E:49:D1:5B:FF X509v3 Authority Key Identifier: keyid:B1:0F:66:B2:40:FD:F4:3E:12:31:03:E6:C7:2B:BE:C6:3A:1A:CB:03 X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment Certificate is to be certified until Aug 11 23:49:27 2013 GMT (30 days) Write out database with 1 new entries Data Base Updated [ubuntu@pki ~rca]$ cp websvcrt.pem ../websv [ubuntu@pki ~rca]$ cd ../websv
[ubuntu@pki ~websv]$ openssl x509 -in websvcrt.pem -out websvcrt.pem [ubuntu@pki ~websv]$ openssl x509 -inform PEM -outform DER -in websvcrt.pem -out websvcrt.der [ubuntu@pki ~websv]$
apache2の設定を実施する。
[ubuntu@pki ~websv]$ sudo vi /etc/apache2/sites-available/default-ssl #SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem #SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key SSLCertificateFile /home/ubuntu/ssl/websv/websvcrt.pem SSLCertificateKeyFile /home/ubuntu/ssl/websv/private/websvkey.pem
[ubuntu@pki ~websv]$ sudo a2enmod ssl [ubuntu@pki ~websv]$ sudo a2ensite default-ssl [ubuntu@pki ~websv]$ sudo /etc/init.d/apache2 restart
前の手順で作成しておいたルート証明書をクライアント(ブラウザ)にインストールする
実際にブラウザから接続してみて、セキュリティ警告がでないことを確認する。
ちなみに、上記のままのCSRだと、FQDNが正しくないと警告がでてしまうため、ローカルのIPアドレスなどを指定する。
/ssl/clientに作成するものとする。
[ubuntu@pki ~ssl]$ mkdir ~/ssl/client [ubuntu@pki ~ssl]$ cd ~/ssl/client
[ubuntu@pki ~client]$ mkdir private
[ubuntu@pki ~client]$ openssl req -config ../configs/openssl_req.cnf -new -newkey rsa:2048 -keyout private/clientkey.pem -out clientcsr.pem Generating a 2048 bit RSA private key ................+++ ..........................+++ writing new private key to 'private/clientkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- 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) [JP]:JP State or Province Name (full name) []:tokyo Organization Name (eg, company) []:Prosper2 Organizational Unit Name (eg, section) []:Client Certificate Common Name (e.g. server FQDN or YOUR name) []:Client Certificate ubuntu@SVrca01:~/ssl/client$ ls
[ubuntu@pki ~client]$ cp clientcsr.pem ../ica
[ubuntu@pki ~client]$ cd ../ica [ubuntu@pki ~ica]$ openssl ca -config ../configs/openssl_sign.cnf -keyfile private/icakey.pem -batch -days 30 -cert icacrt.pem -extensions v3_client -in clientcsr.pem -out clientcrt.pem Using configuration from ../configs/openssl_sign.cnf Enter pass phrase for private/icakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Jul 13 03:47:34 2013 GMT Not After : Aug 12 03:47:34 2013 GMT Subject: countryName = JP stateOrProvinceName = tokyo organizationName = Prosper2 organizationalUnitName = Client Certificate commonName = Client Certificate X509v3 extensions: X509v3 Subject Key Identifier: 4C:E7:6B:0E:D0:8A:7D:48:15:FB:3D:9E:EA:97:61:98:03:09:77:0C X509v3 Authority Key Identifier: keyid:94:15:EC:04:A1:25:24:82:18:13:DF:07:A3:31:83:43:DA:08:16:BF X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Client Authentication Certificate is to be certified until Aug 12 03:47:34 2013 GMT (30 days) Write out database with 1 new entries Data Base Updated [ubuntu@pki ~ica]$ cp clientcrt.pem ../client [ubuntu@pki ~ica]$ cd ../client
[ubuntu@pki ~client]$ openssl pkcs12 -export -inkey private/clientkey.pem -in clientcrt.pem -out clientcrt.p12 Enter pass phrase for private/clientkey.pem: Enter Export Password: Verifying - Enter Export Password: [ubuntu@pki ~client]$
apache2の設定を実施する。
[ubuntu@pki ~client]$ sudo vi /etc/apache2/sites-available/default-ssl #SSLCACertificatePath /etc/ssl/certs/ #SSLCACertificateFile /etc/apache2/ssl.crt/ca-bundle.crt SSLCACertificatePath /home/ubuntu/ssl/rca/ SSLCACertificateFile /home/ubuntu/ssl/rca/rcacrt.pem #SSLVerifyClient require #SSLVerifyDepth 10 SSLVerifyClient require SSLVerifyDepth 2
[ubuntu@pki ~client]$ sudo /etc/init.d/apache2 restart
前の手順で作成しておいた中間証明書をクライアント(ブラウザ)にインストールする
前の手順で作成しておいたクライアント証明書をクライアント(ブラウザ)にインストールする
実際にブラウザから接続してみて、セキュリティ警告がでないことを確認する。