【openssl】使いたくない暗号化方式を落として openssl をビルドする方法

  • 13
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

■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 まで教えてください