CipherScan
==========
[](https://travis-ci.org/mozilla/cipherscan)

CipherScan 测试给定目标上所有主要 SSL 和 TLS 版本的密码套件排序。它还提取一些证书信息、TLS 选项、OCSP 装订等。CipherScan 是 `openssl s_client` 命令行的封装。
CipherScan 旨在运行于所有类 Unix 系统。它自带针对 Linux/64 和 Darwin/64 的 OpenSSL 构建。在其他平台上,它将使用操作系统提供的 openssl 版本(可能支持的密码有限),或通过 `-o` 命令行标志提供您自己的版本。
示例
--------
基本测试:
```bash
$ ./cipherscan google.com
...................
目标: google.com:443
prio ciphersuite protocols pfs curves
1 ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 ECDH,P-256,256bits prime256v1
2 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1
3 ECDHE-RSA-AES128-SHA TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
4 ECDHE-RSA-RC4-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
5 AES128-GCM-SHA256 TLSv1.2 None None
6 AES128-SHA256 TLSv1.2 None None
7 AES128-SHA TLSv1.1,TLSv1.2 None None
8 RC4-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 None None
9 RC4-MD5 SSLv3,TLSv1,TLSv1.1,TLSv1.2 None None
10 ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1
11 ECDHE-RSA-AES256-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1
12 ECDHE-RSA-AES256-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
13 AES256-GCM-SHA384 TLSv1.2 None None
14 AES256-SHA256 TLSv1.2 None None
15 AES256-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 None None
16 ECDHE-RSA-AES128-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1
17 ECDHE-RSA-DES-CBC3-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
18 DES-CBC3-SHA SSLv3,TLSv1,TLSv1.1,TLSv1.2 None None
证书: trusted, 2048 bit, sha1WithRSAEncryption signature
TLS ticket lifetime hint: 100800
OCSP stapling: not supported
密码顺序: server
```
测试 STARTTLS:
```
darwin$ $ ./cipherscan --curves -starttls xmpp jabber.ccc.de:5222
................................
目标: jabber.ccc.de:5222
prio ciphersuite protocols pfs curves
1 ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1
2 ECDHE-RSA-AES256-SHA384 TLSv1.2 ECDH,P-256,256bits prime256v1
3 ECDHE-RSA-AES256-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
4 DHE-RSA-AES256-GCM-SHA384 TLSv1.2 DH,1024bits None
5 DHE-RSA-AES256-SHA256 TLSv1.2 DH,1024bits None
6 DHE-RSA-AES256-SHA TLSv1,TLSv1.1,TLSv1.2 DH,1024bits None
7 DHE-RSA-CAMELLIA256-SHA TLSv1,TLSv1.1,TLSv1.2 DH,1024bits None
8 AES256-GCM-SHA384 TLSv1.2 None None
9 AES256-SHA256 TLSv1.2 None None
10 AES256-SHA TLSv1,TLSv1.1,TLSv1.2 None None
11 CAMELLIA256-SHA TLSv1,TLSv1.1,TLSv1.2 None None
12 ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1
13 ECDHE-RSA-AES128-SHA256 TLSv1.2 ECDH,P-256,256bits prime256v1
14 ECDHE-RSA-AES128-SHA TLSv1,TLSv1.1,TLSv1.2 ECDH,P-256,256bits prime256v1
15 DHE-RSA-AES128-GCM-SHA256 TLSv1.2 DH,1024bits None
16 DHE-RSA-AES128-SHA256 TLSv1.2 DH,1024bits None
17 DHE-RSA-AES128-SHA TLSv1,TLSv1.1,TLSv1.2 DH,1024bits None
18 DHE-RSA-SEED-SHA TLSv1,TLSv1.1,TLSv1.2 DH,1024bits None
19 DHE-RSA-CAMELLIA128-SHA TLSv1,TLSv1.1,TLSv1.2 DH,1024bits None
20 AES128-GCM-SHA256 TLSv1.2 None None
21 AES128-SHA256 TLSv1.2 None None
22 AES128-SHA TLSv1,TLSv1.1,TLSv1.2 None None
23 SEED-SHA TLSv1,TLSv1.1,TLSv1.2 None None
24 CAMELLIA128-SHA TLSv1,TLSv1.1,TLSv1.2 None None
证书: UNTRUSTED, 2048 bit, sha1WithRSAEncryption signature
TLS ticket lifetime hint: None
OCSP stapling: not supported
密码顺序: client
曲线顺序: server
曲线回退: False
```
使用 `-j` 命令行选项导出为 JSON:
```javascript
$ ./cipherscan --curves -j www.ebay.com | j
{
"curves_fallback": "False",
"serverside": "True",
"target": "www.ebay.com:443",
"utctimestamp": "2015-04-03T14:54:31.0Z",
"ciphersuite": [
{
"cipher": "AES256-SHA",
"ocsp_stapling": "False",
"pfs": "None",
"protocols": [
"TLSv1",
"TLSv1.1",
"TLSv1.2"
],
"pubkey": [
"2048"
],
"sigalg": [
"sha1WithRSAEncryption"
],
"ticket_hint": "None",
"trusted": "True"
},
{
"cipher": "ECDHE-RSA-DES-CBC3-SHA",
"curves": [
"prime256v1",
"secp384r1",
"secp224r1",
"secp521r1"
],
"curves_ordering": "server",
"ocsp_stapling": "False",
"pfs": "ECDH,P-256,256bits",
"protocols": [
"TLSv1",
"TLSv1.1",
"TLSv1.2"
],
"pubkey": [
"2048"
],
"sigalg": [
"sha1WithRSAEncryption"
],
"ticket_hint": "None",
"trusted": "True"
}
]
}
```
分析配置
------------------------
开发 CipherScan 的初衷是帮助运维人员在其端点上配置良好的 TLS。为进一步支持这一点,脚本 `analyze.py` 将 CipherScan 的结果与 https://wiki.mozilla.org/Security/Server_Side_TLS 中的 TLS 指南进行比较,并输出一个等级和建议。
```bash
$ ./analyze.py -t jve.linuxwall.info
jve.linuxwall.info:443 has intermediate tls
需要更改以匹配旧等级:
* 考虑启用 SSLv3
* 添加密码 DES-CBC3-SHA
* 使用带有 sha1WithRSAEncryption 签名的证书
* 考虑启用 OCSP 装订
需要更改以匹配中级等级:
* 考虑启用 OCSP 装订
需要更改以匹配现代等级:
* 移除密码 AES128-GCM-SHA256
* 移除密码 AES256-GCM-SHA384
* 移除密码 AES128-SHA256
* 移除密码 AES128-SHA
* 移除密码 AES256-SHA256
* 移除密码 AES256-SHA
* 禁用 TLSv1
* 考虑启用 OCSP 装订
```
在上面的输出中,`analyze.py` 表明目标 `jve.linuxwall.info` 符合中级配置。如果该站点的管理员希望达到现代等级,则应纠正现代测试中失败的项目。
`analyze.py` 不对什么是好的等级做任何假设。站点运维人员应根据他们想要支持的兼容性级别,知道他们想要匹配的等级。再次,请参考 https://wiki.mozilla.org/Security/Server_Side_TLS 了解更多信息。
关于 Nagios 模式的说明:
`analyse.py` 可以使用 `--nagios` 作为 nagios 检查运行。退出代码将代表配置的状态:
* 2(严重)表示 TLS 配置差
* 1(警告)表示不匹配所需等级
* 0(正常)表示匹配。
cipherscan 可能需要超过 10 秒才能完成。为了缓解任何超时问题,您可能希望在 nagios 之外运行它,通过一些临时文件传递数据。
OpenSSL
-------
CipherScan 使用针对 Linux 64 位和 Darwin 64 位的自定义 openssl 发行版。OpenSSL 是从 Peter Mosmans 维护的自定义分支构建的,该分支包含许多未合并到上游的补丁。可以在此处找到:
https://github.com/PeterMosmans/openssl
您可以使用以下命令自行构建:
```
git clone https://github.com/PeterMosmans/openssl.git --depth 1 -b 1.0.2-chacha
cd openssl
./Configure zlib no-shared experimental-jpake enable-md2 enable-rc5 \
enable-rfc3779 enable-gost enable-static-engine linux-x86_64
make depend
make
make report
```
静态链接的二进制文件将是 `apps/openssl`。
贡献者
------------
* Julien Vehent <[email protected]> (原始作者)
* Hubert Kario <[email protected]> (共同维护者)
* Pepi Zawodsky <[email protected]>
* Michael Zeltner <[email protected]>
* Peter Mosmans <[email protected]>
* Vincent Riquer <[email protected]>
* Christian Stadelmann
* Simon Deziel <[email protected]>
* Aaron Zauner <[email protected]>
* Mike <[email protected]>
* Phil Cohen <[email protected]>
* Samuel Kleiner <[email protected]>
* Richard Soderberg <https://twitter.com/floatingatoll>
* Adam Crosby <[email protected]>