接続先サーバで使用可能なcipherを知りたい--curl_20141027
curlのビルド時にどのSSLライブラリを使用するかで使用可能なcipherも変わってくる。そのため、全てのcipherを確認することはできない。あくまでも、確認できるのはクライアントが使用可能なcipherの中で、サーバーも使用可能なものを調べる、というスタンスになる。
curlで使用するcipherを指定する
同一の宛先に対して、使用可能なcipherを使用して順番に接続するスクリプトは以下のようになる。
#!/bin/bash SUPPORTED_CIPHERS="supported-ciphers.txt"; if [ $# -ne 2 ];then echo "Usage $0 DestServer URI" exit 1; fi if [ -e $SUPPORTED_CIPHERS ];then rm $SUPPORTED_CIPHERS; fi ciphers=`openssl ciphers -v | awk '{print $1}'` > /dev/null; for i in $ciphers do curl --silent --insecure --ciphers $i https://$1$2 > res.html; RRR=`wc -l res.html | awk '{print $1}'`; if [ "$RRR" = "0" ];then echo "$i is not supported on this server."; else echo "$i" >> $SUPPORTED_CIPHERS; fi done
宛先は引数で指定することで可用性を持たせる。しかし、問題は応答だ。302とかでBodyなしで返ってきた場合と、そもそもSSL Handshakeで失敗した場合との違いをどのように判定するか。あらかじめ、302にならない宛先を調べておかないといけないのかも。そこは少し考える必要があるが、応答があるとすれば応答の有無で判定できる。以下は自分のテスト環境での結果。
:~# ./check-remote-ciphers.sh localhost /index.html ... :~# :~# :~# :~# openssl ciphers -v | wc 77 462 5834 :~# wc supported-ciphers.txt 29 29 555 supported-ciphers.txt :~#
まだ課題は残るが・・・