弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

サーバー証明書とクライアント証明書(オレオレ証明書) update9

Apacheにサーバー証明書とクライアント証明書を指定する
オレオレ証明書

Cygwinでクライアント証明書発行

/usr/ssl/openssl.cnfを修正

countryName_default           = JP
stateOrProvinceName_default   = SomeWhere
localityName                  = SomePref
0.organizationName_default    = Hoge
organizationalUnitName_default        = HogeHoge
commonName_default            = Hoge_CA
emailAddress_default          = hoge@somewhere.jp


$ mkdir ssl2
$ cd ssl2
$ cat /dev/null > index.txt
$ echo '01' > serial
$ echo '01' > crlnumber
$ mkdir private
$ mkdir private/newcerts
$ chmod 700 private
$ mkdir newcerts
$ mkdir crl
$ mkdir certs

秘密キーの作成
$ openssl genrsa -out private/cakey.pem 1024

CA証明書の作成
$ openssl req -new -x509 -days 1825 -key private/cakey.pem -out cacert.pem

DER形式に変換
$ openssl x509 -in cacert.pem -outform DER -out cacert.der

ikeyman立ち上げ
CMS型で鍵データベースファイルを新規作成
c:\somewhere\key.kdb
パスワードをファイルに隠しておきますか?をチェック
c:\somewhere\key.sth

署名者証明書にcacert.derを追加
個人証明書要求でcertreq.armを作成

$ cp /usr/ssl/openssl.cnf ./openssl_server.cnf
$ vi openssl_server.cnf

証明書タイプをサーバ証明書に変更 ./openssl_server.cnf

[ CA_default ]
#default_md      = default                # use public key default MD
default_md      = sha256                # default is an unsupported message digest typeエラー回避w

[ usr_cert ]
nsCertType                      = server

certreq.armに対して署名する
$ openssl ca -config ./openssl_server.cnf -policy policy_anything -out ./cert-server.pem -infiles certreq.arm

証明書の確認
$ openssl verify -CAfile cacert.pem cert-server.pem

サーバ証明書をDER形式に変換する
$ openssl x509 -in cert-server.pem -out cert-server.der -outform der

ikeymanの個人用証明書プルダウンでcert-server.derファイルを「受信...」

CA証明書をブラウザに組み込めるようにder形式に変換
$ openssl x509 -inform pem -in cacert.pem -out cacert.der -outform der

CA証明書をpkcs12形式に変更
$ openssl pkcs12 -export -inkey private/cakey.pem -in cacert.pem -out cacert.p12

クライアント証明書要求の作成
$ openssl req -new -key private/cakey.pem -out client_req.pem

$ cp /usr/ssl/openssl.cnf .
$ mv openssl.cnf openssl_client.cnf

クライアント証明書タイプを変更 openssl_client.cnf
[ usr_cert ]
nsCertType                      = client, email

クライアント証明書要求に署名
$ openssl ca -config openssl_client.cnf -out client_cert.pem -infiles client_req.pem

クライアント証明書をpkcs12形式に変更
$ openssl pkcs12 -export -in client_cert.pem -inkey private/cakey.pem -certfile cacert.pem -out client_cert.p12 -name Hoge_Client -caname Hoge_CA
このとき組み込み用パスワードを設定

ikeymanはWebSphere付属のIHSのキーストア。以下はopenssl実装のApache2.2での証明書の作成方法。

[0.make_private_key.sh]

#!/bin/sh
mkdir -p private
openssl genrsa -out private/cakey.pem 1024
[1.make_ca_cert.sh]
#!/bin/sh
openssl req -config ./openssl.cnf -new -x509 -days 1825 -key private/cakey.pem -out cacert.pem
[2.conv_ca_cert_der.sh]
#!/bin/sh
openssl x509 -in cacert.pem -outform DER -out cacert.der
[3.req_server_cert.sh]
#!/bin/sh
openssl req -config ./openssl_server.cnf -new -keyout server_key.pem -out server_req.pem
[4.sign_server_cert.sh]
#!/bin/sh
mkdir -p newcerts
cp /dev/null index.txt
echo 01 > serial
echo 01 > crlnumber
openssl ca -config ./openssl_server.cnf -key private/cakey.pem -out server_cert.pem -infiles server_req.pem
[5.cp_server_cert.sh]
#!/bin/sh

# remove password from server_key.pem
openssl rsa -in server_key.pem -out server_key_nopass.pem

cp cacert.pem '/cygdrive/c/Program Files (x86)/Apache Software Foundation/Apache2.2/conf'
cp server_cert.pem '/cygdrive/c/Program Files (x86)/Apache Software Foundation/Apache2.2/conf'
cp server_key_nopass.pem	'/cygdrive/c/Program Files (x86)/Apache Software	Foundation/Apache2.2/conf'
[6.req_client_cert.sh]
#!/bin/sh
openssl req -config ./openssl_client.cnf -new -keyout client_key.pem -out client_req.pem
[7.sign_client_cert.sh]
#!/bin/sh
openssl ca -config ./openssl_client.cnf -key ../0.ca/private/cakey.pem -out client_cert.pem -infiles client_req.pem
[8.make_pkcs12_client_cert.sh]
#!/bin/sh
openssl pkcs12 -export -in client_cert.pem -inkey private/cakey.pem -certfile cacert.pem -out client_cert.p12 -name Hoge_Client -caname Hoge_CA
$

クライアント証明書に署名するときに以下のエラーになることがある。

failed to update database
TXT_DB error number 2
どうもindex.txtの
/C=JP/ST=SomePref/O=HogeCA/OU=HogeOUServer/CN=win-hoge/emailAddress=hoge@nsa.gov
の部分が同一だとユニークにならないからエラーになるみたいだ。
$ cat index.txt
V       140326012911Z           01      unknown /C=JP/ST=SomePref/O=HogeCA/OU=HogeOUServer/CN=win-hoge/emailAddress=hoge@nsa.gov
V       140326014941Z           02      unknown /C=JP/ST=SomePref/O=HogeCA/OU=HogeOUClient/CN=win-hoge/emailAddress=hoge@nsa.gov
$
あと要求を引き下げるとか。
$ openssl ca -key ../0.ca/private/cakey.pem -config ./openssl_client.cnf -revoke ./newcerts/02.pem
Using configuration from ./openssl_client.cnf
Revoking Certificate 02.
Data Base Updated
$

FFでもIEでもCA証明書を先にインポートしたあとにクライアント証明書をインポートしないと 個人証明書の分類にCA証明書が配置され証明チェインが壊れるのは仕様か? ←最初にCA証明書をインポートするのはサーバ証明書の信頼されたルート証明機関でも使うため。 クライアント証明書を先にインポートすると個人証明書のフォルダーにCA証明書がインポートされる。 その状態だとサーバ証明書のCA証明書には使われない配置になる。

FFが間違った証明書を通してしまうので混乱してしまう。 つーことはFFの証明書の検証は怪しいことになるな。

Internet Explorer 8 & User Certificates
WinXPのIE8で証明書が無効になるバグがある。 ←これは証明書がうまくできてないから。

[Thu Apr 04 15:22:22 2013] [error] Init: SSLPassPhraseDialog builtin is not supported on Win32 (key file C:/Program Files (x86)/Apache Software Foundation/Apache2.2/conf/server_key.pem)
Entrust Certificate Services Support Knowledge Base
2. Use the OpenSSL command to remove the passphrase such as;

openssl rsa -in server.key.org -out server.key
server.key will be your new private key with the passphrase removed.

Tomcat7のSSLポートを公開するには、
/etc/tomcat/server.xml

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               keystoreFile="/usr/share/tomcat/.keystore"
               keystorePass="hogehoge"
               URIEncoding="UTF-8"
               clientAuth="false"
               sslProtocol="TLS"
               useServerCipherSuitesOrder="true"
               ciphers="TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
                        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
                        TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
                        TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
                        TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
                        TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
                        TLS_RSA_WITH_AES_256_CBC_SHA256,
                        TLS_RSA_WITH_AES_256_CBC_SHA,
                        SSL_RSA_WITH_3DES_EDE_CBC_SHA"
    />

5.conv_server_cert_der.sh

#!/bin/sh
openssl x509 -in server_cert.pem -outform DER -out server_cert.der

6.tomcat_keystore.sh

#!/bin/sh
rm -f ./tomcat.keystore
LANG=C keytool -genkey -alias priv_key -keyalg RSA -sigalg SHA256withRSA -keysize 2048 -validity 7305 -keystore ./tomcat.keystore -storepass hogehoge << END_OF_RES0
Hoge
Hoge
Hoge
HogeCity
HogePref
JP
y

END_OF_RES0

LANG=C keytool -import -alias ca -keystore ./tomcat.keystore -file ../0.ca/cacert.der << END_OF_RES
hogehoge
y
END_OF_RES

LANG=C keytool -import -alias tomcat -keystore ./tomcat.keystore -file ./server_cert.der << END_OF_RES2
hogehoge
y
END_OF_RES2

LANG=C keytool -list -keystore tomcat.keystore << END_OF_RES3
hogehoge
END_OF_RES3

7.nopassword_server_cert.exp

#!/usr/bin/expect -f
set timeout 1
spawn openssl rsa -in server_key.pem -out server_key_nopass.pem
log_user 1
expect "Enter pass phrase for server_key.pem:"
send "hogehoge\r"
expect eof exit 0
# EOF

7.cp_server_cert.sh

#!/bin/sh

./7.nopassword_server_cert.exp

cp ../0.ca/cacert.pem /etc/pki/tls/certs/.
cp server_cert.pem /etc/pki/tls/certs/.
cp server_key_nopass.pem /etc/pki/tls/private/.

cp tomcat.keystore /usr/share/tomcat/.keystore

systemctl stop httpd.service
systemctl restart tomcat.service
systemctl start httpd.service
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHAの記事も参考。

投稿されたコメント:

コメント
コメントは無効になっています。