「OpenSSL」 独自認証局を構築する ( その後証明書発行するまで )
OpenSSL で独自認証局の構築をやってみたので、メモしておきます。
設定ファイルを自分で作って、openssl ca コマンド直で叩いてってやりたかったですが、なかなか時間かかりそうだったので、OpenSSL がデフォルトで用意してくれている「CA.sh」と「openssl.cnf」を使う感じでやっています。
では、さっそく。細かいところは飛ばして ( 正直あんまりわかってないので ) 手順だけいきます。
0. OpenSSL をインストールする
今回は OpenSSL 1.0.1m を使ってます。以下からソースダウンロードして、コンパイルする ( 詳細は割愛・・・m(_ _)m )
・OpenSSL: Source, Tarballs
https://www.openssl.org/source/
インストールディレクトリは /usr/local/openssl/1.0.1m にしました。
1. CA のルートディレクトリを作成して、そこに CA.sh、openssl.cnf をコピーする
mkdir /usr/local/tmp/openssl3/RootCA cd /usr/local/tmp/openssl3 cp /usr/local/openssl/1.0.1m/ssl/misc/CA.sh . cp /usr/local/openssl/1.0.1m/ssl/openssl.cnf .
2. コピーした CA.sh、openssl.cnf の設定を変更する
まず、ルートディレクトリに関連する箇所を変更する。
■ CA.sh
if [ -z "$CATOP" ] ; then CATOP=/usr/local/tmp/openssl3/RoorCA ; fi
環境変数 CATOP を設定している箇所を上記のように変更する。
■ openssl.cnf
[ CA_default ] dir = /usr/local/tmp/openssl3/RoorCA
[ CA_default ] セクションにある dir も上記のように変更する。
openssl.cnf は追加で [ usr_cert ] セクションの basicConstraints=CA:FALSE を basicConstraints=CA:TRUE に変更する。
[ usr_cert ] - 略 - basicConstraints=CA:TRUE
↑の変更は Web 上にたくさん情報ありますが、OpenSSL の情報としては、以下あたりの記載だと思います。
・Manual:X509(1) - OpenSSLWiki
https://wiki.openssl.org/index.php/Manual:X509%281%29
抜粋
The basicConstraints extension CA flag is used to determine whether the certificate can be used as a CA. If the CA flag is true then it is a CA, if the CA flag is false then it is not a CA. All CAs should have the CA flag set to true.
3. CA.sh で独自認証局を作成する
まず、上記で作成した openssl.cnf が使用されるように環境変数 OPENSSL_CONFIG を設定する
export OPENSSL_CONF=/usr/local/tmp/openssl3/openssl.cnf
newca オプションを渡して CA.sh を実行する ( 秘密鍵のパスフレーズやら、証明書の Subject はよしなに入力する )。
./CA.sh -newca
無事実行が終わると、RootCA ディレクトリ配下に色々ファイルが作成されます。cacert.pem がルート証明書、private/cakey.pem が秘密鍵になります。
以上で独自認証局の構築は終了ですが、せっかくなので構築した独自認証局から証明証 ( 今回はサーバ証明書 ) を発行してみます。
4. サーバ証明書を発行してみる
サーバ証明書ということで openssl.cnf の [ v3_req ] セクションに extendedKeyUsage = serverAuth を追記しておく ( たぶん、追記なしでも大丈夫そうな気はする )。
[ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth
・x509v3_config - X509 V3 certificate extension configuration format
- Extended Key Usage.
https://www.openssl.org/docs/apps/x509v3_config.html#Extended-Key-Usage
作業ディレクトリを作成する。
mkdir /usr/local/tmp/openssl3/server cd /usr/local/tmp/openssl3/server
秘密鍵を作成する ( 暗号化はなし )。
openssl genrsa 2048 > server.key
・genrsa - generate an RSA private key
https://www.openssl.org/docs/apps/genrsa.html
証明書発行要求を作成する。
openssl req -new -days 365 -key server.key -out server.csr -config ../openssl.cnf
・req - PKCS#10 certificate request and certificate generating utility.
https://www.openssl.org/docs/apps/req.html
証明書を発行する。
openssl ca -policy policy_anything -config ../openssl.cnf -in server.csr -keyfile ../RootCA/private/cakey.pem -cert ../RootCA/cacert.pem -out server.crt -extensions v3_req
・ca - sample minimal CA application
https://www.openssl.org/docs/apps/ca.html
証明書の内容を表示する。拡張領域の内容も意図した通りになってるかな。
openssl x509 -text -noout -in server.crt Certificate: Data: Version: 3 (0x2) Serial Number: 8a:99:56:90:a4:32:8c:c4 Signature Algorithm: sha1WithRSAEncryption Issuer: C=JP, ST=ca, O=ca, OU=ca, CN=ca.com/emailAddress=ca@ca.com Validity Not Before: Mar 29 15:35:08 2015 GMT Not After : Mar 28 15:35:08 2016 GMT Subject: C=JP, ST=server, L=server, O=server, OU=server, CN=example.com/emailAddress=server@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b7:9b:12:a0:3c:fb:1d:06:aa:02:e5:f6:fd:53: 9c:75:23:8e:d1:11:1d:1c:35:d7:6e:49:34:08:e1: 38:1d:ff:d0:69:75:ef:0e:11:91:2f:4a:86:8d:ee: 4c:64:45:a2:07:72:7a:b7:28:2c:98:da:25:42:dc: ae:36:a0:8d:4b:e9:66:64:49:44:c7:cd:ad:0c:17: c1:20:0d:c6:4e:30:03:a6:ad:bc:ad:67:02:ee:04: a0:2b:8b:ee:83:41:db:f3:21:d6:3d:15:d0:3e:58: 74:26:93:ef:48:11:77:62:41:25:1e:23:2c:04:3f: db:24:3c:f0:bc:9c:2c:e4:39:72:fd:e1:e3:fa:35: 9b:2a:9f:ca:49:0c:04:f0:ab:ea:3c:57:61:2d:bd: 0f:d0:a6:ef:50:20:c8:d1:97:09:4d:29:3e:1d:be: 2d:43:d2:3d:43:01:cf:4b:2c:38:c6:e3:de:de:71: 0c:36:4e:24:3b:d5:47:0b:cb:f5:65:38:c6:03:e8: b3:c7:57:bc:4b:9c:6d:85:c3:bc:91:9a:f4:a2:99: a8:a4:d3:02:d8:ad:70:88:8e:0b:b1:95:28:1b:af: 1e:92:0c:f0:8e:d2:13:94:b4:2d:62:6d:e6:4e:c2: aa:99:7a:d9:8c:8a:38:24:6f:d6:8e:40:a9:51:dd: c8:51 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Extended Key Usage: TLS Web Server Authentication Signature Algorithm: sha1WithRSAEncryption 74:60:e1:9c:19:09:49:94:38:79:04:0f:d0:36:b0:dc:2e:d8: 72:0b:b9:f9:02:e6:03:47:cb:b3:1d:71:c2:76:45:ad:10:10: e3:67:20:e1:bf:4f:26:80:5e:ff:86:e4:1e:dc:ae:5d:1e:6e: 03:d8:02:4c:69:af:be:e8:88:5b:d9:6b:c2:f3:65:71:7a:64: fa:0a:10:a9:dc:ff:56:c1:71:c5:78:03:70:e7:1c:69:38:b1: 9f:c0:66:d3:51:22:97:a5:00:87:8c:f9:49:d4:4c:07:1c:0f: da:c2:90:88:74:2c:ce:4e:e6:8c:34:7b:18:70:29:e9:28:26: 03:d2
・x509 - Certificate display and signing utility
https://www.openssl.org/docs/apps/x509.html
サーバ証明書の作成も以上で終了です。
一応テストしておきます。クライアント Java - サーバ Apache HTTP Server でやってみました。
SSLCertificateFile /usr/local/tmp/openssl3/server/server.crt SSLCertificateKeyFile /usr/local/tmp/openssl3/server/server.key
Java 側の設定
キーストアにルート証明書をインポートする。
keytool -importcert -alias ca -file cacert.pem -keystore castore -storepass password
コードとか詳細は以下のエントリーに記載しています。
・「Java」 HttpsURLConnection で HTTPS 通信する ( サーバ認証あり ) - プログラム日記
http://a4dosanddos.hatenablog.com/entry/2015/03/29/125111
ちゃんと HTTPS 通信できたでしょうか?以上です。
[ 環境情報 ]
サーバ
CentOS 6.2
OpenSSL 1.0.1m
Apache HTTP Server 2.2.15