Hatena::Grouplinux2

Going My Linux Way このページをアンテナに追加 RSSフィード

2010年11月07日(日)

OpenSSL の demo CA

| 23:12 |  OpenSSL の demo CA  - Going My Linux Way を含むブックマーク はてなブックマーク -  OpenSSL の demo CA  - Going My Linux Way  OpenSSL の demo CA  - Going My Linux Way のブックマークコメント

OpenSSL の demo CA に関するメモです。

古いメモです。

demoCA の作成 [OpenSSL]

プライベート CA(認証局) を作成する。

$ cd $cadir/                 # CA を作る任意のディレクトリに移動                     
$ /usr/lib/ssl/misc/CA.sh -newca
CA certificate filename (or enter to create)
(空 [Enter])
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) [AU]:(適切な値を入力)
State or Province Name (full name) [Some-State]:(適切な値を入力)
Locality Name (eg, city) []:(適切な値を入力)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:(適切な値を入力)
Organizational Unit Name (eg, section) []:(適切な値を入力)
Common Name (eg, YOUR name) []:(適切な値を入力。ここは空にしない)
Email Address []:(適切な値を入力)

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: 0 (0x0)
        Validity
            Not Before: Jul  8 23:07:51 2009 GMT
            Not After : Jul  7 23:07:51 2012 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Some-State
            organizationName          = self
            commonName                = local CA
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                15:0F:85:CD:48:5C:F9:43:D9:EB:8D:C8:99:1B:20:0E:A1:19:9C:67
            X509v3 Authority Key Identifier: 
                keyid:15:0F:85:CD:48:5C:F9:43:D9:EB:8D:C8:99:1B:20:0E:A1:19:9C:67
                DirName:/C=JP/ST=Some-State/O=self/CN=local CA
                serial:00

            X509v3 Basic Constraints: 
                CA:TRUE
Certificate is to be certified until Jul  7 23:07:51 2012 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated

プライベート CA の実体である demoCA ディレクトリが作成されている。

$ tree demoCA/
demoCA/
|-- cacert.pem          # CA の証明書
|-- careq.pem           # CACSR
|-- certs/              # 検証用証明書置き場
|-- crl/                # CRL 置き場
|-- index.txt           # CAデータベース
|-- index.txt.attr
|-- index.txt.old
|-- newcerts/           # CA 発行の証明書置き場
|   `-- 00.pem          # シリアルナンバー 00 の証明書(cacert.pem)
|-- private/
|   `-- cakey.pem       # CA の鍵
|-- serial              # シリアルナンバー追跡用ファイル
`-- serial.old

4 directories, 9 files

(以上、EcoLinux で試行)

demoCA での証明書発行 [OpenSSL]

プライベート CA で証明書を発行する。

手順

  1. CSR と鍵の作成 (本来、申請者の作業)
  2. CSR への署名 (=証明書の発行。本来、CA の作業)


(EcoLinux の場合の実行例)

$ cd $cadir/             # demoCA があるディレクトリに移動
$ /usr/lib/ssl/misc/CA.sh -newreq
Generating a 1024 bit RSA private key
........................................++++++
..++++++
writing new private key to 'newkey.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) [AU]:(適切な値を入力)
State or Province Name (full name) [Some-State]:(適切な値を入力)
Locality Name (eg, city) []:(適切な値を入力する)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:(適切な値を入力)
Organizational Unit Name (eg, section) []:(適切な値を入力する)
Common Name (eg, YOUR name) []:(適切な値を入力。ここは空にしない)
Email Address []:(適切な値を入力)

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

$ ls newkey.pem
newkey.pem        # 鍵が作成されている

$ ls newreq.pem
newreq.pem         # CSR が作成されている

$ /usr/lib/ssl/misc/CA.sh -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:(CA 鍵のパスフレーズ)
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jul  9 00:39:52 2009 GMT
            Not After : Jul  9 00:39:52 2010 GMT
        Subject:
            countryName               = JP
            stateOrProvinceName       = Some-State
            organizationName          = self
            commonName                = www.example.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                76:48:E1:4C:42:C3:B0:49:FC:07:A0:F9:0A:92:0F:56:CE:39:43:09
            X509v3 Authority Key Identifier: 
                keyid:15:0F:85:CD:48:5C:F9:43:D9:EB:8D:C8:99:1B:20:0E:A1:19:9C:67

Certificate is to be certified until Jul  9 00:39:52 2010 GMT (365 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
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=JP, ST=Some-State, O=self, CN=local CA
        Validity
            Not Before: Jul  9 00:39:52 2009 GMT
            Not After : Jul  9 00:39:52 2010 GMT
        Subject: C=JP, ST=Some-State, O=self, CN=www.example.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:dd:02:39:b6:cf:54:c4:1e:38:78:cb:b2:b0:03:
                    fe:aa:8c:5c:e5:60:fc:98:56:aa:7d:c1:55:93:e5:
                    04:7d:5a:62:03:1f:fa:05:13:c6:be:4d:b3:8e:72:
                    b3:df:a7:4d:40:83:96:cf:dc:5c:0c:92:fd:30:e4:
                    58:67:bf:40:9d:61:bf:b5:6e:2a:6b:b7:60:c1:90:
                    a7:f5:76:aa:ef:f1:48:27:10:55:0c:09:4a:51:ae:
                    c3:4e:0b:af:4b:bc:e9:65:bc:c7:74:18:06:bc:5d:
                    db:df:f4:19:b0:b9:28:ed:9d:8c:a7:54:1a:0c:7f:
                    5f:1e:ac:25:b7:c8:25:23:39
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                76:48:E1:4C:42:C3:B0:49:FC:07:A0:F9:0A:92:0F:56:CE:39:43:09
            X509v3 Authority Key Identifier: 
                keyid:15:0F:85:CD:48:5C:F9:43:D9:EB:8D:C8:99:1B:20:0E:A1:19:9C:67

    Signature Algorithm: sha1WithRSAEncryption
        3b:57:17:a6:74:7c:a1:dc:5e:ff:84:e0:0f:c9:6d:a9:37:16:
        25:33:c8:6f:43:79:c6:4c:19:5d:4f:35:4b:7b:d0:ac:81:ef:
        34:9d:49:5b:60:a8:e1:a2:86:a5:f4:53:0f:f7:0b:3f:bf:24:
        20:58:fe:0f:73:00:5c:b6:b4:3b:42:3a:1c:9b:e1:c7:0f:cb:
        64:a4:a0:bb:db:c1:25:99:48:0a:07:77:0c:ef:ca:e1:1f:16:
        f1:e0:3f:1b:75:1b:c0:40:2d:2d:99:3f:6b:22:92:f4:bf:2e:
        77:b0:58:7a:22:9e:ae:b2:d8:88:a7:35:22:37:a0:e6:a4:1b:
        16:0d
 -----BEGIN CERTIFICATE-----
MIICgDCCAemgAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJKUDET
MBEGA1UECBMKU29tZS1TdGF0ZTENMAsGA1UEChMEc2VsZjERMA8GA1UEAxMIbG9j
YWwgQ0EwHhcNMDkwNzA5MDAzOTUyWhcNMTAwNzA5MDAzOTUyWjBLMQswCQYDVQQG
EwJKUDETMBEGA1UECBMKU29tZS1TdGF0ZTENMAsGA1UEChMEc2VsZjEYMBYGA1UE
AxMPd3d3LmV4YW1wbGUub3JnMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDd
Ajm2z1TEHjh4y7KwA/6qjFzlYPyYVqp9wVWT5QR9WmIDH/oFE8a+TbOOcrPfp01A
g5bP3FwMkv0w5Fhnv0CdYb+1biprt2DBkKf1dqrv8UgnEFUMCUpRrsNOC69LvOll
vMd0GAa8Xdvf9BmwuSjtnYynVBoMf18erCW3yCUjOQIDAQABo3sweTAJBgNVHRME
AjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0
ZTAdBgNVHQ4EFgQUdkjhTELDsEn8B6D5CpIPVs45QwkwHwYDVR0jBBgwFoAUFQ+F
zUhc+UPZ643ImRsgDqEZnGcwDQYJKoZIhvcNAQEFBQADgYEAO1cXpnR8odxe/4Tg
D8ltqTcWJTPIb0N5xkwZXU81S3vQrIHvNJ1JW2Co4aKGpfRTD/cLP78kIFj+D3MA
XLa0O0I6HJvhxw/LZKSgu9vBJZlICgd3DO/K4R8W8eA/G3UbwEAtLZk/ayKS9L8u
d7BYeiKerrLYiKc1Ijeg5qQbFg0=
 -----END CERTIFICATE-----
Signed certificate is in newcert.pem

$ ls newcert.pem
newcert.pem      # 証明書が作成されている

demoCA 発行の証明書の検証 [OpenSSL]

プライベート CA が発行した証明書を検証する。

$ cd $cadir/             # demoCA があるディレクトリに移動
$ /usr/lib/ssl/CA.sh -verify newcert.pem
newcert.pem: OK

openssl コマンドで証明書のステータスをチェックする。

$ openssl x509 -serial -in newcert.pem -noout
serial=01                    # シリアル番号が表示される
$ cd $cadir/                 # demoCA があるディレクトリに移動
$ openssl ca -status 01   # シリアル番号を指定する
01=Valid (V)

(以上、EcoLinux で試行)

demoCA 発行の証明書の失効 [OpenSSL]

demoCA で発行した証明書を失効させる。

$ cd $cadir/               #  demoCA のあるディレクトリへ移動
$ openssl ca -revoke newcert.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:(CA 鍵のパスフレーズ入力)
Revoking Certificate 01.
Data Base Updated

証明書のステータスを確認する。

$ openssl x509 -serial -in newcert.pem -noout
serial=01
$ cd $cadir/               #  demoCA のあるディレクトリへ移動
$ openssl ca -status 1
Using configuration from /usr/lib/ssl/openssl.cnf
01=Revoked (R)     # ステータスはRevoked に変更されている

CRL を作成する。

demoCA/crlnumber がない場合は 事前に作成する。

$ cd $cadir/               #  demoCA のあるディレクトリへ移動
$ [ -f demoCA/crlnumber ] || echo "00" >demoCA/crlnumber
$ openssl ca -gencrl -out demoCA/crl/crl.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:(CA 鍵のパスフレーズ入力)

CRL の内容を表示する。

$ openssl crl -text -in demoCA/crl/crl.pem
Certificate Revocation List (CRL):
        Version 2 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: /C=JP/ST=Some-State/O=self/CN=localCA
        Last Update: Jul 10 08:11:48 2009 GMT
        Next Update: Aug  9 08:11:48 2009 GMT
        CRL extensions:
            X509v3 CRL Number: 
                0
Revoked Certificates:
    Serial Number: 01
        Revocation Date: Jul 10 08:06:43 2009 GMT
    Signature Algorithm: sha1WithRSAEncryption
        7e:75:7a:19:60:56:5c:9a:d0:04:e9:24:4b:d1:73:40:dc:4d:
        f8:e5:89:81:cd:48:c6:45:7d:50:19:2a:0d:93:18:dd:c9:94:
        08:d0:ed:fa:17:b5:a1:36:49:b3:e6:f3:5d:55:20:7c:8a:d7:
        71:d5:1d:71:5e:b3:56:36:90:a0:6b:e2:87:c2:9d:9c:07:68:
        56:19:9d:bb:38:7a:f4:42:5f:e8:e0:ac:4a:ec:93:74:2b:eb:
        f7:f0:a2:ba:c8:f3:42:9c:36:8c:93:0d:df:60:c9:e2:38:81:
        f3:2b:18:ab:3c:76:0c:bc:1d:0a:1f:e2:0d:c4:91:ec:23:85:
        22:0e
 -----BEGIN X509 CRL-----
MIIBMTCBmwIBATANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDETMBEGA1UE
CBMKU29tZS1TdGF0ZTENMAsGA1UEChMEc2VsZjEQMA4GA1UEAxMHbG9jYWxDQRcN
MDkwNzEwMDgxMTQ4WhcNMDkwODA5MDgxMTQ4WjAUMBICAQEXDTA5MDcxMDA4MDY0
M1qgDjAMMAoGA1UdFAQDAgEAMA0GCSqGSIb3DQEBBQUAA4GBAH51ehlgVlya0ATp
JEvRc0DcTfjliYHNSMZFfVAZKg2TGN3JlAjQ7foXtaE2SbPm811VIHyK13HVHXFe
s1Y2kKBr4ofCnZwHaFYZnbs4evRCX+jgrErsk3Qr6/fworrI80KcNoyTDd9gyeI4
gfMrGKs8dgy8HQof4g3EkewjhSIO
 -----END X509 CRL-----

CRL検証する。

$ openssl crl -in demoCA/crl/crl.pem -CAfile demoCA/cacert.pem
verify OK
 -----BEGIN X509 CRL-----
MIIBMTCBmwIBATANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDETMBEGA1UE
CBMKU29tZS1TdGF0ZTENMAsGA1UEChMEc2VsZjEQMA4GA1UEAxMHbG9jYWxDQRcN
MDkwNzEwMDgxMTQ4WhcNMDkwODA5MDgxMTQ4WjAUMBICAQEXDTA5MDcxMDA4MDY0
M1qgDjAMMAoGA1UdFAQDAgEAMA0GCSqGSIb3DQEBBQUAA4GBAH51ehlgVlya0ATp
JEvRc0DcTfjliYHNSMZFfVAZKg2TGN3JlAjQ7foXtaE2SbPm811VIHyK13HVHXFe
s1Y2kKBr4ofCnZwHaFYZnbs4evRCX+jgrErsk3Qr6/fworrI80KcNoyTDd9gyeI4
gfMrGKs8dgy8HQof4g3EkewjhSIO
 -----END X509 CRL-----

(以上、EcoLinux で試行)

HTTP クライアントへの CA証明書のインポート [OpenSSL]

プライベート CA 発行のサーバ証明書を持ったローカルな HTTP サーバに、

HTTPSアクセスしようとしても、多分問題が起きる。


プライベート CA のことは Web ブラウザは知らないので、プライベート CA署名していてもサーバ証明書を信用しない。

(Verisign とか著名なCAの証明書はブラウザインポート済みなのでこの問題は起きない)

プライベート CA の証明書を信用できる認証局の証明書としてブラウザインポートすれば、この問題に対処できる。(自己署名証明書の場合、インポートするのはサーバ証明書自身)


もうひとつ、問題がある。

ブラウザサーバ証明書の CN (CommonName) と URI のホスト名が一致しているかチェックする。

対処するには、サーバ証明書の CN をホスト名に合せるか、CN で名前解決できるように DNS や hosts を設定するしかない。

(localhost に閉じた話ならば、CN を "localhost" にして、https://localhost/アクセスすればよい)


証明書のインポートは、

firefox の場合、

設定の「詳細」タブ ->「暗号化」タブ ->「証明書を表示」ボタン ->「認証局証明書」タブ -> 「インポート」ボタンを押して、後はウィザートに従う。

IE の場合、

インターネットオプションの「コンテンツ」タブ->「証明書」ボタン -> 「信頼されたルート証明機関」タブ -> 「インポート」ボタンを押して、後はウィザートに従う。

(不要になったら、インポートした CA 証明書は削除するほうがセキュリティ上よい)

wget の場合、--ca-certificate オプションCA 証明書を指定。

$ wget --ca-certificate=cacert.pem https://localhost/

curl の場合、--cacer オプションCA 証明書を指定。

$  curl --cacert cacert.pem https://localhost/