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

### ■1 About
openssl で使える暗号化スイートのうち
どーーーーしても使いたくない暗号化方式を落としてビルドする方法

openssl0.9.7e
With Fedora

備忘録です。



### ■2 何を落としたい？
★をつけた「EXP-RC4-MD5」っていう方法を使えなくしたいけど、
./Configure 時のオプションに no-rc4 は使いたくない場合
(RC4 が全部落ちちゃうのはちょっとね・・・)

<pre>
 # 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
</pre>



### ■3 探す
<pre>
★EXP-RC4-MD5             SSLv2【←ここに注目】 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
</pre>

SSLv2 なので

<pre>
ssl/ssl2.h
ssl/s2_lib.c
</pre>

を見ると

居た。

<pre>
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"
</pre>


### ■4 無効にする
<pre>
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,
	},
</pre>



### ■5 ビルドして確認する
ビルドは省略します。

1.サーバでCA証明書 mycert.pem ファイルを作成する
Country Code とか住所とか会社名とか聞かれますが、デタラメな値で良いです。(全部「US」って入れた)

<pre>
 # openssl req -x509 -nodes -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
</pre>


2.試験用サーバを起動する

<pre>
 # openssl s_server -cert mycert.pem -www &
</pre>


3.クライアントで暗号化方式を指定して接続する

<pre>
 # 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:
</pre>


本来はこんな感じに SSLセッションを張れる
<pre>
 # 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
</pre>


■ 備考
・SSLv3 を使う暗号化スイートについて
SSLv3 の暗号化スイートは、それぞれ

<pre>
 ssl/s3_lib.c
 ssl/ssl3.h
</pre>
 
に居ます。

<pre>
 ssl/tls1.h
</pre>

も見ておくといいかも。(find して grep した方が早いか・・・)



・DSS 使うやつは DSA認証する openssl サーバを立てましょう。

これとか。
<pre>
EXP-EDH-DSS-DES-CBC-SHA SSLv3 Kx=DH(512)  Au=DSS★  Enc=DES(40)   Mac=SHA1 export
</pre>


1.openssl サーバを立てる(DSA(DSS)認証)
サーバ側の準備

DSA秘密鍵の生成
<pre>
 # openssl dsaparam -out dsakey.pem -genkey 1024
</pre>

DSA CA証明書を作成する
パスワードの入力を求められるため何か入れます
<pre>
 # openssl req -x509 -newkey dsa:dsakey.pem  -keyout cacert.pem -out cacert.pem
</pre>

DSA CA証明書を用いて openssl サーバを起動する
さきほど入力したパスワードを求められます
【！】パスワードが入力できなくなるためバックグラウンドで実行しないこと(コマンドの最後に & をつけてはいけない)
<pre>
 # openssl s_server -cert cacert.pem -www
</pre>



クライアント側は、DSSを使う暗号化方式を指定して接続するだけです

<pre>
 # openssl s_client -cipher EXP-EDH-DSS-DES-CBC-SHA -connect 192.168.1.5:4433
</pre>


・ssl2 ssl3 両方でサポートされている暗号化スイートについて
ssl2 ssl3 両方でサポートされている場合は
それぞれ s2_lib.c s3_lib.c 内で別々に定義されています。

<pre>
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"

</pre>

確認するときに、クライアント側で SSLv2 または SSLv3 を指定しましょう。
指定しなければ SSLv3 になるはず。

<pre>
 SSLv2 指定で繋げる

 # openssl s_client -ssl2 -cipher EXP-RC2-CBC-MD5 -connect 192.168.1.5:4433
</pre>



※誤字、誤り等、気づいたことがあれば @docokano まで教えてください