「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 でやってみました。

Apache 側 ( CentOS 同梱を使用 ) の設定

■ /etc/httpd/conf.d/ssl.conf

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

クライアント
Windows 7 SP1
Java SE 8 Update 25