OpenSSL攻略

GUMOXIN 33 0 PDF 2021-03-26 23:03:57

2前 关于《 Https权威指南》 当我刚开始使用SSL的时候,我非常希望有一本类似《HTPS权威指南》的书。我记不清那 是什么时候了,不过肯定是很早之前,那时候我们还需要给 Apache打补丁以便让它支持SSL。不 过我还记得,当我在2005年写第一本书 Apache securit的时候,我开始感激密码学的复杂性,甚 至开始喜欢上它了。 209年,我开始从事于 SSL Labs的工作,此时密码学的世界才向我敞开。之后的几年(直到 2015年)我依旧在学习。密码学是一个独特的领域,你学的东西越多,就会发现知道的东西越少。 在支持 SSL Labs用户的那段时间里,我意识到虽然有很多关于SSL/TLS以及PKI的著作,但 是这些材料都存在两个问题:(1)你需要的内容分布在不同的地方,很难形成整体(例如,RFC), 因而难以寻找;(2)大多数著作都非常详细而且深入底层。很多文档已经废弃。为了让这些材料 变得有价值,我花了好几年时间工作和学习,才仅仅开始理解整个生态体系。 《HTPS权威指南》弥补了这些文档的空白。它是一本经过实践的书,刚开始会有一个简单 的介绍以及固定的理论背景,然后会讨论你日常工作中需要的所有东西。它还覆盖了一些密钥相 关的知识,例如协议攻击。如果你想了解更多,还有非常多的参考文档以及外部资源可供学习。 关于作者 Ivan ristic是一位安全研究员、工程师、作者。他对于Web应用防火墙领域的发展,开源Web 应用防火墙 ModSecurity的开发,以及在 SSL Labs网站上对SSL/TLS和PKI的研究、工具和指南的 发表,都作出了很大的贡献,因此享誉世界。 他写过 Apache securit、 ModSecurity handbook,和《 Https权威指南》三本书,并将其发表到 Feisty duck上。 Feisty duck是他持续写作和发表的平台。lvan是安全社区的活跃参与者,经常在 Black hat、RSA、 OWASP App Sec等各种安全会议上进行演讲。他之前就职于 Qualys公司,担任 应用安全研究主任。 目录 第1章 OpenSSL.................. 4.3创建二级CA 35 1.1入门 第2章使用 Open SSL进行测试 ...38 1.1.1确定 OpenSSL版本和配置......2 1.1.2构建 OpenSSL... 2.1连接SSL服务 ............38 2.2测试升级到SSL的协议 42 1.1.3查看可用命令 4 1.1.4创建可信证书库... 2.3使用不同的握手格式.....................42 1.2密钥和证书管理...............6 2.4提取远程证书 1.2.1生成密钥 6 2.5测试支持的协议 ......43 26测试支持的密码套件 .........44 1.2.,2创建证书签名申请 1.2.3用当前证书生成CSR文件.........11 2.7测试要求包含SNI的服务器..................44 45 1.2.4非交互方式生成CSR 28测试会话复用 1.2.5自签名证书... 12 2.9检查OCSP吊销状态· 1.2.6创建对多个主机名有效的证书...12 .10测试 OCSP stapling 48 ...48 1.2.7检查证书 13 2.11检查CRL吊销状态 1.2.8密钥和证书格式转换 2.12测试重新协商..............................50 15 3配置 17 2.13测试 BEAST漏洞......... 1.3.1选择密码套件 ...............17 214测试心脏出血 1.3.2性能 27 2.15确定Dife- Hellman参数的强度 1.4创建私有证书颁发机构... 29附录 A SSL/TLS部署最佳实践 ...56 4.1功能和限制 30 1.4.2创建根CA 30附录B改动 67 第1章 OpenSSL OpenSsl是一个开源项目,包括密码库和SSL/TLS工具集。从项目的官方站点可以看到: OpenSsL项目是安全套接字层( secure sockets layer,SSL)和传输层安全( transport layer security,TLS)协议的一个实现,是大家共同努力开发出的代码可靠、功能齐全、 商业级别的开源工具集。项目由遍布世界的志愿者所组成的社区进行管理,他们通过互 联网进行沟通、计划和开发 OpenSSL工具集以及相关的文档。 OpenSsL在这一领域已经成为事实上的标准,并且拥有比较长的历史。 OpenSsL的代码前身 是 SSLeay,由 Eric a. Young和 Tim]. Hudson在1995年开发出来。因为后来Eric和Tim停止了 SSLeay 的更新,转而为澳大利亚的RSA公司开发商业版本的 SSL/TLS工具集 BSAFE SSL-C,所以 OpenssL 项目在1998年的最后几天诞生了。 现在几乎所有的服务器软件和很多客户端软件都在使用 OpenSsl,其中基于命令行的工具是 进行密钥、证书管理以及测试最常用到的软件了。有意思的是,之前很多使用其他库作为SSL/TLS 解析的浏览器正发生一些变化,例如 Google正在将 Chrome迁移到他们自己的 Openssl分支 Boring SSL。2 OpenSsL是基于 OpenSSL和 SSLeay双许可证下的授权模式,两种许可都类似于BSD,同时有 一个建议的条款。 OpenSsL的许可在很长一段时间里都是争论的焦点,因为其中任何一个许可都 与GPL家族不兼容。因此,你会发现那些基于GPL许可的程序比较偏向于使用 Gnutls。 11入门 如果你使用的操作系统是基于Uniixx的,那么几乎可以肯定上面已经安装了 OpenSSL,我们的 入门步骤也会变得非常简单。唯一可能的问题是版本不是最新的。在本节中,我假设你已经在使 用Unx平台,因为 OpenSSL天生就基于Unx平台 Windows的用户就稍微麻烦了,最简单的情况是你仅仅需要使用 OpenSSLI的命令行工具,可 1名称 SSLeay中的eay是 Eric a. Young的首字母缩写。 22BoringSSL,htps:/www.chromium.org/Home/chromium-security/boringssl(Chromium,检索于2015年6月30日) 2第1章 OpenSSL 以在 OpenSSL的网站上找到 Shining Light Production的链接,它拥有已经编译好的 Windows)版本 的 Openssl。如果你想要 OpenSsL的所有功能,需要确保那些编译好的 OpenSSL都是基于同一个 版本编译出来的,否则可能会遇到难以解决的崩溃问题。最好的办法是使用一个包含你需要的所 有程序的软件包。例如,如果你想要在 Windows上运行 Apache,那么可以直接从Apac- he lounge 获取对应的二进制文件 1.1.1确定 OpenSSL版本和配置 在开始之前,你要首先确定当前使用的 OpenSSL版本。下面是我在 Ubuntu1204LTS上面运 行 openssl vesion获得的版本信息,后面所有的演示都是基于这个环境 s openss⊥ version OpenSSL 1.0.1 14 Mar 2012 在写这本书的时候, OpenSSL0.9x正在向 OpenSSL1.0.x发展。1.0.1最大的意义在于它是第 个同时支持LS1.1和1.2的版本。总体来说,支持新协议是大趋势,所以我们还要经历一段新 老协议不互通的过程。 注意 不同的操作系统经常会修改 OpenSSL的代码,主要是修复一些已知漏洞。然而项目的 名称和版本号经常保持原样,也没有任何迹象表明代码其实是原项目的一个分支, 些行为已经变化了。例如现在使用的 Ubuntu12.04LTS的 OpenSSL是基于1.0.1c版本 全名是 openss11.0.1-4 ubuntu5.16,包含了很多已知问题的补丁。3 可以使用-a开关获取完整的版本信息: s openssl version -a OpenssL 1.0.1 14 Mar 2012 built on: Fri Jun 20 18: 54: 15 UTC 2014 platform: debian-amd64 tions: bn(64, 64) rc4(8x, int )des (idx, cisc, 16, int)blowfish(idx) compiler: CC-fPIC -DOPENSSL PIC-DZLIB-DOPENSSL THREADS -D REENTRANT-DDSO DLFCN e DHAVE DLFCN H -m64-DL ENDIAN - -g-02-fstack-protector e param=sSp-buffer-size=4 -Wformat -Wformat-security -Werrorsformat-security -D e FORTIFY SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z, relro -Wa, --noexecstack -Wall e DOPENSSL NO TLS1 2 CLIENT -DOPENSSL MAX TLS1 2 CIPHER LENGTH=50-DMD32 REG T=int e -DOPENSSL IA32 SSE2 -DOPENSSL BN ASM MONT -DOPENSSL BN ASM MONT5-DOPENSSL BN ASM GF2m-DSHA1 ASM-DSHA256 ASM-DSHA512 ASM-DMD5 ASM-DAES ASM-DVPAES ASM-DBSAES e ASM-DWHIRLPOOL ASM-DGHASH ASM OPENSSLDIR: /usr/lib/ssl 1Win32 OpenSsL,htt:/ slproweb. com/products/Win.32 OpenSSL. html( Shining light Productions,检索于2014年7月3日) 2apachE2.4Vc14BinariesandModules,http://www.apachelounge.com/download/(ApacheLoungeKaF2015f7 月15日)。 3 Precise版本的 OpenSSL源代码包,htps:/ launchpad. net/ubuntu/precise/+ source/openss.(Ubun如u,检索于2014年7月3日) 1.1入门3 上面最后一行的输出(/usr/ib/s)是 OpenSSL默认情况下查找配置和证书的目录。在我1 的系统里,该位置是/etc/ss1的别名(也就是软链接), Ubuntu会在其中保存与TLS相关的文件 lrwxrwxrwx 1 root root 14 Apr 19 09: 28 certs ->/etc/ssl/cer drwxr-xr-x 2 root root 4096 May 28 06: 04 misc lrwxrwxrWx 1 root root 20 May 22 17: 07 openssl cnf ->/etc/ssl/openssl cnf lrwxrwxrWx 1 root root 16 Apr 19 09: 28 private ->/etc/ssl/private misc/目录包含一些补充脚本,其中最有用的脚本允许你实现一个私有的证书颁发机构 1.1.2构建 Open SsL 大多数情况下使用操作系统默认提供的 OpenSSL就够了,但最好还是升级到最新版本。例如 你当前的系统还在使用 OpenSsL0.9x,而你想使用更新的TLS协议(在 OpenSSL1.0.1以上版本中 才有)。当然,新版本的 OpenSsL可能无法提供你想要的所有功能,例如在 Ubuntu12.04LTS上的 openssl s client命令就不支持SSL2。虽然默认不支持SSL2是对的,但是如果需要测试别的服 务器是否支持SSL2,我们就需要这类功能。 你可以先下载最新版本的 Openssl(我使用的是1.0.1h): swgethttp://www.openssl.org/source/openssl-1.0.1h.tar.gz 在编译之前我们还需要进行配置。一般情况下,我们配置的安装目录不要与系统默认提供的 OpenSsL目录一样,例如 $. config prefix=/opt/openssl openssldir=/opt/openssl enable-ec istp 64 gCC 128 enable-ec_ nist_64gcc_128参数可以让我们使用优化后的一些常用的椭圆曲线算法,这个 优化基于编译器的一些特性,默认情况下会关闭这些特性,而且无法自动检测。 然后执行下面这些命令: S make depend s sudo make install 然后在/ opt/openss录下面,我们可以看到: drwxr-xr-x 2 rootroot 4096 Jun 3 08: 49 bin drwxr-xr-x 2 root root 4096 Jun 3 08: 49 certs drwxr-xI-x3 root root 4096 Jun 3 08: 49 include drwxr-xr-x 4 rootroot 4096 Jun 3 08: 49 lib drwxr-xr-x 6 rootroot 4096 Jun 3 08: 48 man drwxr-xr-x 2 rootroot 4096 Jun 3 08: 49 misc -rw-r--I--1 root root 10835 Jun 3 08: 49 openssl cnf drwxr-xr-X 2 root root 4096 Jun 3 08: 49 private private/目录默认是空的,因为我们还没有生成任何私钥, certs目录也是如此。 OpenSSL不包 括任何根证书,因为维护一个可信证书库不在 OpenSSL项目的范围之内。幸运的是,很多操作系 4第1章 OpenSSL 统可能已经安装了可信证书库,当然你也可以自己创建一个,1.1.4节会具体介绍。 注意 编译软件辶前,熟悉编译器的默认配置是很重要的。系统提供的软件一般都会尽可能 地使用到编译器的优化选项,但是如果你自己编译的话,就不一定能保证这些优化选 项都能用到。 1.1.3查看可用命令 OpenSSL包含了很多密码相关的工具。我计算了一下,我的版本大概有46个,简直可以称为 密码学领域的瑞士军刀。即便现在你只会用到其中的一部分工具,但是还是有必要熟悉所有的工 具,这样在将来需要的时候才能知道你有哪些工具可以使用。 OpenSSL没有专门的hep关键字,任何时候输入 Openssl无法识别的命令,就会显示帮助 文本: s openssl help openssl: Error: help is an invalid command tandard commands asnlparse ciphers rl2pkcs7 dhparam dsa saparam gendh genda genpkey genrsa nseg kcs12 pkcs7 pkcs prime and s client s t sess id smime sp version X509 第一部分帮助列出了所有可以使用的工具。如果对于某个命令,想获取更加详细的信息,可 以使用man加上工具的名称。例如 man ciphers会告诉我们密码套件是如何配置的。 帮助信息不止上面这些,但是剩下的就没这么有意思了,在第二部分的帮助信息里我们可以 看到可用的消息摘要命令: Message Digest commands (see the dgst command for more details md4 nd5 rmd160 sh sha1 然后在第三部分的帮助信息中,我们可以看到所有的加密命令 Cipher commands (see the 'enc'command for more details) aes-128-cbo aes-128-ecb aes-192-ecb compilerhardeninginUbuntuandDebian,https://outflux.net/blog/archives/2014/02/03/compiler-hardening-in-ubuntu and- debian/( Kees cook,2014年2月3日)。 1.1入门5 aes-256-cbc aes-256-ecb bf-cbc bf-cfb bf-ecb bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb camellia-256-cbc camellia-256 cast-cbo cast5-cbc cast5-cfb casts-ecb cast5-ofb des-ede des-ede3-cbc des-ede3-cfb des-ede3-ofb des-ofb des 3 desy rC2-40-cbc rC2-64-cbc rc2-cbc rc2-cfb d-cbo seed-cfb seed-ecb seed-ofb 1.1.4创建可信证书库 OpenSsL没有自带可信根证书(也叫作可信证书库),所以如果你是自己从头开始安装的话, 那么就需要从别的地方找找了。一种选择是使用操作系统自带的可信证书库,一般来说没有问题, 但是这个可信证书库可能不是最新的。更好的一种选择是从 Mozilla那里获取,虽然麻烦一点,但 是 Mozilla花费了很多时间维护一个可靠的可信证书库,例如我为自己在 SSL Labs写的评估工具使 用的就是这个可信证书库 因为是开源的,所以 Mozilla将可信证书库保存在源代码存储库中: https://hg.mozillaorg/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt 但是 mozilla将这些证书以一种比较特殊的格式存放,其他人很少使用。所以如果不介意的话, 我们可以从第三方(例如Cur项目)去获取最新的PEM( privacy- enhanced mail)格式的可信证书 库,这种格式可以直接使用 http://curl.haxx.se/docs/caextract.html 当然,如果你更愿意直接从 Mozilla下载可信证书库,也有现成的用Per或者Go语言编写的脚 本,这样你就无需自己编写了。在后面几节我会介绍这两个工具 注意 如果你最终决定自己编写解析 Mozilla可信证书库脚本的话,需要注意根证书文件中实 际包含了两种类型的证书:一部分是可信的,另外一部分是明确不可信的。 Mozilla 使用这种方式去禁用那些被盗用的中间证书(例如 DigiNotar的那些老证书),上面提 到的Perl和Go脚本会识别出不可信证书。 1.使用Pe脚本 Cur项目提供了由 Guenter Knauf使用Pe编写的 Mozilla可信证书库转换脚本 https://raw.github.com/bagder/curl/master/lib/mk-ca-bundle.pl 下载这个脚本之后直接运行就会从 Mozilla下载最新的证书数据并且转换为PEM格式 $./mk-ca-bundle pl 6第1章 OpenSSL Downloading certdata txt Processing' certdata.txt’... Done(156 CA certs processed, 19 untrusted skipped) 如果还有之前下载过的证书数据,这个脚本会将两份证书数据进行对比,然后只处理更新的 部分。 2.使用Go脚本 如果你更喜欢使用Go语言,那么可以从 Github下载 Adam Langley编写的工具: https://github.com/agl/extract-nss-root-certs 开始转换之前先下载这个小工具: swgethttps://raw.github.com/agl/extract-nss-root-certs/master/convertmozillacertdata.go 然后下载 Mozilla证书数据: swgethttps://hg.mozillaorg/mozilla-central/raw-file/tip/security/nss/lib/ckfw/e builtins/certdata. txt--output-document certdata txt 最后使用下面的命令转换文件: s go run convert mozilla certdata go > ca-certificates 2012/06/04 09: 52: 29 Failed to parse certificate starting on line 23068: negative serial number 在我的例子里面有一个无效的证书是GoX.509无法处理的,其他的都正常处理了。 1.2密钥和证书管理 大多数用户借助 Openssli是因为希望配置并运行能够支持SSL的web服务器。整个过程包括3 个步骤:(1)生成强加密的私钥;(2)创建证书签名申请( certificate signing request,CSR)并且发 送给CA;(3)在你的web服务器上安装CA提供的证书。这些步骤(还有其他一些)会在本节详细 说明。 1.2.1生成密钥 在使用公钥加密之前的第一步是生成一个私钥。在开始之前,你必须进行几个选择。 口密钥算法 OpenSSL支持RSA、DSA和 ECDSA密钥,但是在实际使用场景中不是所有密钥类型都适 用的。例如对于web服务器的密钥,所有人都使用RSA,因为DSA一般因为效率问题会 限制在1024位( Internet Explorer不支持更长的DSA密钥),而 ECDSA还没有被大部分的 CA支持。对于SSH来说,一般都是使用DSA和RSA,而不是所有的客户端都支持 ECDSA 算法。 口密钥长度 默认的密钥长度一般都不够安全,所以我们需要指定要配置的密钥长度。例如RSA密钥 默认的长度是512位,非常不安全。如果今天你的服务器上还是用512位的密钥,入侵者

用户评论
请输入评论内容
评分:
暂无评论