Shammer's Philosophy

My private adversaria

接続先サーバで使用可能な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
:~# 

まだ課題は残るが・・・