在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
现在网上有关SSL的资料较多的是基于VC开发,Delphi的SSL开发资源很少。 本文主要使用OpenSSL为基础,讲述SSL的有关开发流程。OpenSSL功能非常丰富,具体可以去她的官方网看看。可惜没有中文说明。 OpenSSL:http://www.openssl.org/ 一.1、 SSL协议是什么SSL 是一个缩写,代表的是 Secure Sockets Layer。它是支持在 Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有到达它预定的目标后才被解密。证书和密码学算法支持了这一切的运转,使用 OpenSSL,您将有机会切身体会它们。 理论上,如果加密的数据在到达目标之前被截取或窃听,那些数据是不可能被破解的。不过,由于计算机的变化一年比一年快,而且密码翻译方法有了新的发展,因此,SSL 中使用的加密协议被破解的可能性也在增大。 可以将 SSL 和安全连接用于 Internet 上任何类型的协议,不管是 HTTP、POP3,还是 FTP。还可以用 SSL 来保护 Telnet 会话。虽然可以用 SSL 保护任何连接,但是不必对每一类连接都使用 SSL。如果连接传输敏感信息,则应使用 SSL。 一.2、 什么是 OpenSSL?OpenSSL 不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。关于 OpenSSL 库的内容非常多,远不是一篇文章可以容纳的。 OpenSSL 不只是 API,它还是一个命令行工具。命令行工具可以完成与 API 同样的工作,而且更进一步,可以测试 SSL 服务器和客户机。它还让开发人员对 OpenSSL 的能力有一个认识。 二、 CA概念描述CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。 CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。 如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。 如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。 二.1、 证书证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。 证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X。509 国际标准。 如何在电子文档上实现签名的目的呢?我们可以使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下: 信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。 在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的。对这些HASH函数的特殊要求是: 1.接受的输入报文数据没有长度限制; 2.对任何输入报文数据生成固定长度的摘要(数字指纹)输出; 3.从报文能方便地算出摘要; 4.难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要; 5.难以生成两个不同的报文具有相同的摘要。 验证: 收方在收到信息后用如下的步骤验证您的签名: 1.使用自己的私钥将信息转为明文; 2.使用发信方的公钥从数字签名部分得到原摘要; 3.收方对您所发送的源信息进行hash运算,也产生一个摘要; 4.收方比较两个摘要,如果两者相同,则可以证明信息签名者的身份。 如果两摘要内容不符,会说明什么原因呢? 可能对摘要进行签名所用的私钥不是签名者的私钥,这就表明信息的签名者不可信;也可能收到的信息根本就不是签名者发送的信息,信息在传输过程中已经遭到破坏或篡改。 二.2、 数字证书数字证书为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。 二.3、 使用数字证书能做什么?数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。 在线交易中您可使用数字证书验证对方身份。用数字证书加密信息,可以确保只有接收者才能解密、阅读原文,信息在传递过程中的保密性和完整性。有了数字证书网上安全才得以实现,电子邮件、在线交易和信用卡购物的安全才能得到保证。 二.4、 认证、数字证书和PKI解决的几个问题l 保密性 - 只有收件人才能阅读信息。 l 认证性 - 确认信息发送者的身份。 l 完整性 - 信息在传递过程中不会被篡改。 l 不可抵赖性 - 发送者不能否认已发送的信息。 三、 搭建SSL工作流程
|
|
(搭建OpenSSL)
|
(根证书获取方法图)
1、 OpenSSL源代码,可以直接到官网下载最新代码。
2、 标准C编译器(可以用VC,这里使用的是VC),编译动态库。
3、 Perl5编译环境,OpenSSL编译需要Perl环境。官网有的下。
OpenSSL源代码库路径: c:"opensslsource
1、 进入VC命令行编译环境
2、 进入OpenSSL源代码目录: cd c:"opensslsource
3、 执行configure: perl Configure VC-WIN32 --prefix=c:/openssl
4、 创建Makefile文件: ms"do_ms
5、 编译动态库:nmake –f ms"ntdll.mak
6、 测试动态库:nmake –f ms"ntdll.mak test
7、 安装动态库:nmake –f ms"ntdll.mak install
8、 清除零时文件,以后便于重新编译: nmake –f ms"ntdll.mak clean
说明:要生成VC的静态库只要编译 ms"nt.mak 的make文件。
由于OpenSSL的命令繁多,这里不详细说明。具体可以看:BBS水木清华站(FriNov1020:24:102000) [email protected]翻译的内容。已经整理成文档放在目录中。
openssl genrsa -des3 -out server。key 1024
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法。),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令。如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!
去除key文件口令的命令:
openssl rsa -in server.key -out server.key
openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书。屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可。
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf
CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证。CA验证需要服务费,做测试使用可以自己生成。
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
用生成的CA的证书为刚才生成的server。csr,client。csr文件签名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Pem文件是 X.509 PAM 编码(Base64)文件,是个文本文件。可以使用x.509命令进行合成,或直接拷贝粘贴。
上面生成的server文件和client文件合并成2个pem文件。
server使用的文件有:ca.crt,server.crt,server.key
client使用的文件有:ca.crt,client.crt,client.key
把 .crt文件和.key文件合并到同一个文件.pem文件。
上面生成OpenSSL动态库我们现行可以直接加载使用。另外Indy组件封装了OpenSSL的功能模块,可以引用uIdSSLOpenSSLHeaders.pas单元文进行开发。
直接加载动态库开发比较烦琐,所以我们直接适用Indy提供的单元开发。Indy单元文件实现的版本比较老,因此新DLL加载会发生错误。在网上找到一个支持 0.9.7i OpenSSL较新动态库的Indy单元文件。
具体的开发应用可以看Source中的代码。
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论