■1 About
openssl で使える暗号化スイートのうち
どーーーーしても使いたくない暗号化方式を落としてビルドする方法
openssl0.9.7e
With Fedora
備忘録です。
■2 何を落としたい?
★をつけた「EXP-RC4-MD5」っていう方法を使えなくしたいけど、
./Configure 時のオプションに no-rc4 は使いたくない場合
(RC4 が全部落ちちゃうのはちょっとね・・・)
# openssl ciphers -v
(略)
DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1
EXP-EDH-RSA-DES-CBC-SHA SSLv3 Kx=DH(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS Enc=DES(40) Mac=SHA1 export
EXP-DES-CBC-SHA SSLv3 Kx=RSA(512) Au=RSA Enc=DES(40) Mac=SHA1 export
EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC4-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
★EXP-RC4-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
■3 探す
★EXP-RC4-MD5 SSLv2【←ここに注目】 Kx=RSA(512) Au=RSA Enc=RC4(40) Mac=MD5 export
SSLv2 なので
ssl/ssl2.h
ssl/s2_lib.c
を見ると
居た。
ssl/ssl2.h
#define SSL2_TXT_RC4_128_WITH_MD5 "RC4-MD5"
★#define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5 "EXP-RC4-MD5"
#define SSL2_TXT_RC2_128_CBC_WITH_MD5 "RC2-CBC-MD5"
#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5"
■4 無効にする
ssl/s2_lib.c
/* RC4_128_EXPORT40_WITH_MD5 */
{
- 1,
+ 0,
SSL2_TXT_RC4_128_EXPORT40_WITH_MD5,
SSL2_CK_RC4_128_EXPORT40_WITH_MD5,
SSL_kRSA|SSL_aRSA|SSL_RC4|SSL_MD5|SSL_SSLV2,
SSL_EXPORT|SSL_EXP40,
SSL2_CF_5_BYTE_ENC,
40,
128,
SSL_ALL_CIPHERS,
SSL_ALL_STRENGTHS,
},
■5 ビルドして確認する
ビルドは省略します。
1.サーバでCA証明書 mycert.pem ファイルを作成する
Country Code とか住所とか会社名とか聞かれますが、デタラメな値で良いです。(全部「US」って入れた)
# openssl req -x509 -nodes -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
2.試験用サーバを起動する
# openssl s_server -cert mycert.pem -www &
3.クライアントで暗号化方式を指定して接続する
# openssl s_client -cipher EXP-RC4-MD5 -connect 192.168.1.5:4433
CONNECTED(00000003)
3184:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:473:
本来はこんな感じに SSLセッションを張れる
# openssl s_client -cipher EXP-RC4-MD5 -connect 192.168.1.5:4433
(略)
New, TLSv1/SSLv3, Cipher is EXP-RC4-MD5
Server public key is 1024 bit
SSL-Session:
Protocol : TLSv1
Cipher : EXP-RC4-MD5
Session-ID: 501B5EA2E156C135A025E491EA17FE46D1B75FC654ED27BFDC19985249010F0D
Session-ID-ctx:
Master-Key: 8313116FE70202C2ED435F731E811EBFA03F9AE17B6853ACAFA1D1C299F38DAA68CA5A1B4FCFFB7D59F78CF4CE8BF315
Key-Arg : None
Start Time: 1382349941
Timeout : 300 (sec)
V
■ 備考
・SSLv3 を使う暗号化スイートについて
SSLv3 の暗号化スイートは、それぞれ
ssl/s3_lib.c
ssl/ssl3.h
に居ます。
ssl/tls1.h
も見ておくといいかも。(find して grep した方が早いか・・・)
・DSS 使うやつは DSA認証する openssl サーバを立てましょう。
これとか。
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512) Au=DSS★ Enc=DES(40) Mac=SHA1 export
1.openssl サーバを立てる(DSA(DSS)認証)
サーバ側の準備
DSA秘密鍵の生成
# openssl dsaparam -out dsakey.pem -genkey 1024
DSA CA証明書を作成する
パスワードの入力を求められるため何か入れます
# openssl req -x509 -newkey dsa:dsakey.pem -keyout cacert.pem -out cacert.pem
DSA CA証明書を用いて openssl サーバを起動する
さきほど入力したパスワードを求められます
【!】パスワードが入力できなくなるためバックグラウンドで実行しないこと(コマンドの最後に & をつけてはいけない)
# openssl s_server -cert cacert.pem -www
クライアント側は、DSSを使う暗号化方式を指定して接続するだけです
# openssl s_client -cipher EXP-EDH-DSS-DES-CBC-SHA -connect 192.168.1.5:4433
・ssl2 ssl3 両方でサポートされている暗号化スイートについて
ssl2 ssl3 両方でサポートされている場合は
それぞれ s2_lib.c s3_lib.c 内で別々に定義されています。
EXP-RC2-CBC-MD5 SSLv3 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
EXP-RC2-CBC-MD5 SSLv2 Kx=RSA(512) Au=RSA Enc=RC2(40) Mac=MD5 export
(define されている名前は別・・・)
ssl/ssl2.h
#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 "EXP-RC2-CBC-MD5"
ssl/ssl3.h
#define SSL3_TXT_RSA_RC2_40_MD5 "EXP-RC2-CBC-MD5"
確認するときに、クライアント側で SSLv2 または SSLv3 を指定しましょう。
指定しなければ SSLv3 になるはず。
SSLv2 指定で繋げる
# openssl s_client -ssl2 -cipher EXP-RC2-CBC-MD5 -connect 192.168.1.5:4433
※誤字、誤り等、気づいたことがあれば @docokano まで教えてください