OpenSSL

(作成:2013/01)

Linuxなら大概標準で入っているSSL関連パッケージとSSH関連パッケージ。SSL関連は所謂HTTPSなんかで使い、SSH関連はセキュアなシェルアクセスに使うけれど、方法とか便利なTipsについてまとめてみる。
因みに「SSL = Secure Socket Layer」「SSH = Secure SHell」で、つまりそれぞれ実装するレイヤーが異なるので両者は本来別モノね。

OpenSSLで証明書要求ファイルを作る

何のかので仕事によく使うので。

証明書の作成はどのサーバで実施してもOK。CSR作成時の署名登録を簡易にするためにも、自席Linuxがあると良いかもね。
で、まずは鍵ファイル作成。最近は2048bitでないと作ってくれない場合がある。

$ openssl genrsa -rand /dev/urandom -aes256 2048 > www.hyakki.local.key
Generating RSA private key, 2048 bit long modulus
...........................................................................................................+++
....+++
e is 65537 (0x10001)
Enter pass phrase: (任意文字列)
Verifying - Enter pass phrase: (任意文字列)
オプション 意味
genrsa RSA形式の秘密鍵作成。
-rand ... 暗号生成用の乱数発生シードを指定。
-aes256 AES暗号化方式を用いる。
2048 2048bitで秘密鍵を作る。

パスフレーズを残しておくと後々ウザいので(httpd再起動でパスフレーズ入力待ちになったり)、鍵ファイルからパスフレーズ情報をぷち消す。

$ openssl rsa -in www.hyakki.local.key -out www.hyakki.local.nokey
Enter pass phrase for www.hyakki.local.key: (任意文字列)
writing RSA key

CSR作成、の前にこの入力をなるたけ省略したい場合は、あらかじめデフォルト定義をしておくのが良いかと。

# vi /etc/ssl/openssl.cnf
```shell
```ini
[ req_distinguished_name ]
countryName_default = JP
stateOrProvinceName_default = (都道府県)
localityName_default = (市区郡)
0.organizationName_default = (会社名)
emailAddress_default = (管理者E-mail)

こうしておけば毎回同じような項目を入力する手間が省ける。実質Common Nameくらいしか変更しなくて良い。

CSR作成。

# openssl req -new -key www.hyakki.local.nokey -out www.hyakki.local.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) [JP]:
State or Province Name (full name) [(都道府県)]:
Locality Name (eg, city) [(市区郡)]:
Organization Name (eg, company) [(会社名)]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.hyakki.local
Email Address [(管理者E-mail)]:

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

記載無しの対話項目は、未入力のままEnterでOK。OU、CNでFQDN入力するのは、確かRapid-SSLだとそうして欲しいって書かれていた筈。このあたりは場合によりけりで。

オプション 意味
req 証明書要求ファイルを作成。
-new 新規に証明書要求ファイルを作る。
-key ... 鍵ファイル名の指定。
-out ... CSRファイル名の指定。

最後にCSRファイルの最終確認。特に鍵ファイルのbit長なんかは確認しとくこと。

# openssl req -noout -text -in www.hyakki.local.csr
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=JP, ST=(都道府県), L=(市区郡), O=www.hyakki.local, CN=www.hyakki.local/emailAddress=webmaster@hyakki.local
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
                    00:ce:a3:93:22:92:c5:90:d3:45:f7:84:de:0e:14:
                    ...
                    a6:d3
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: md5WithRSAEncryption
        a4:9e:7e:ca:5a:d1:15:12:6b:2f:54:4a:9c:55:7a:52:da:27:
        ...
        94:14:c3:07

OpenSSLでオレオレ証明書を作成する

頁タイトルに偽り有りになっちゃうけれど、試験用途などでよく作るオレオレ証明書の作成方法。CSRファイル生成までは上記手順を参考のほど。
オレオレ証明を作るには、つまりオレオレ認証局を設立しないといけない。といっても然程大層な話でもないので、ひとつドシンと立ててしまいませう。

$ /usr/lib/ssl/misc/CA.sh -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.........................++++++
........++++++
writing new private key to './demoCA/private/./cakey.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]:
State or Province Name (full name) [(都道府県)]:
Locality Name (eg, city) [(市区郡)]:
Organization Name (eg, company) [(会社名)]:
Organizational Unit Name (eg, section) []:Test CA
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address [(管理者E-mail)]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/./cakey.pem: (オレオレ認証局用パスフレーズ)
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            94:69:96:4a:b2:48:f3:98
        Validity
            Not Before: Jan 31 07:05:24 2013 GMT
            Not After : Jan 31 07:05:24 2016 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = (都道府県)
            organizationName          = (会社名)
            organizationalUnitName    = Test CA
            commonName                = localhost
            emailAddress              = (管理者E-mail)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                F0:2D:66:F2:EF:43:39:C4:25:39:D3:82:EB:E0:5B:EB:51:75:77:31
            X509v3 Authority Key Identifier: 
                keyid:F0:2D:66:F2:EF:43:39:C4:25:39:D3:82:EB:E0:5B:EB:51:75:77:31

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Jan 31 07:05:24 2016 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

これだけで認証局の出来上がり。かんたん!すてき!
というわけでCSRから証明書ファイルを生成してみる。

$ openssl ca -in www.hyakki.local.csr -keyfile demoCA/private/cakey.pem -out www.hyakki.local.crt
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for demoCA/private/cakey.pem:(オレオレ認証局用パスフレーズ)
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number:
            94:69:96:4a:b2:48:f3:99
        Validity
            Not Before: Jan 31 07:06:50 2013 GMT
            Not After : Jan 29 07:06:50 2023 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = (都道府県)
            organizationName          = (会社名)
            commonName                = www.hyakki.local
            emailAddress              = (管理者E-mail)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:TRUE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                3B:E5:08:CA:7B:AA:BB:74:8A:C1:2A:BB:D4:E3:1C:80:13:6A:33:94
            X509v3 Authority Key Identifier: 
                keyid:F0:2D:66:F2:EF:43:39:C4:25:39:D3:82:EB:E0:5B:EB:51:75:77:31

Certificate is to be certified until Jan 29 07:06:50 2023 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

こんな感じで出来上がり。

cert+key -> pkcs12形式コンバート

IISにインポートしようとしてもcer+keyの組み合わせではインポート出来なくてイラッとする。というわけでpkcs12形式への変換方法。Windowsの管理UI、まじ何とかしろ……。

# openssl pkcs12 -export -inkey www.hyakki.local.key -in www.hyakki.local.cer -out www.hyakki.local.p12
Enter Export Password:
Verifying - Enter Export Password: