变化证书基本原理,开垦简述

Posted by

摘自:

OpenSSL组件


OpenSSL 是一个开源项目,其组成主要包括一下三个组件:

  • openssl:多用途的命令行工具
  • libcrypto:加密算法库
  • libssl:加密模块应用库,实现了ssl及tls

openssl可以实现:秘钥证书管理、对称加密和非对称加密 。

一、            简介

现在网上有关SSL的资料较多的是基于VC开发,Delphi的SSL开发资源很少。

本文主要使用OpenSSL为基础,讲述SSL的有关开发流程。OpenSSL功能非常丰富,具体可以去她的官方网看看。可惜没有中文说明。

OpenSSL:http://www.openssl.org/

  1. 基本原理

术语


openssl中有如下约定熟成的后缀名称:

* .key:  私有的密钥
* .csr:   证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
* .crt:   证书文件,certificate的缩写
* .crl:   证书吊销列表,Certificate Revocation List的缩写
* .pem:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

一.1、           SSL协议是什么

SSL 是一个缩写,代表的是 Secure
Sockets Layer。它是支持在
Internet 上进行安全通信的标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有到达它预定的目标后才被解密。证书和密码学算法支持了这一切的运转,使用
OpenSSL,您将有机会切身体会它们。

理论上,如果加密的数据在到达目标之前被截取或窃听,那些数据是不可能被破解的。不过,由于计算机的变化一年比一年快,而且密码翻译方法有了新的发展,因此,SSL
中使用的加密协议被破解的可能性也在增大。

可以将 SSL 和安全连接用于 Internet 上任何类型的协议,不管是 HTTP、POP3,还是 FTP。还可以用 SSL 来保护 Telnet 会话。虽然可以用 SSL 保护任何连接,但是不必对每一类连接都使用
SSL。如果连接传输敏感信息,则应使用
SSL。

公司一个项目要进行交易数据传输,因为这个项目银行那边也是刚刚开始启动,所有的支持只有一个传输字段的说明文档,好吧,总的有人做事不是嘛,于是接口开发正式展开,第一步的难点就是加密解密,我选择使用OpenSSL.

公钥私钥的核心功能


  • 加密: 公钥用于对数据进行加密,私钥用于对数据进行解密
  • 签名: 私钥用于对数据进行签名,公钥用于对签名进行验证

一.2、           什么是 OpenSSL?

OpenSSL 不仅仅是 SSL。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字。关于
OpenSSL 库的内容非常多,远不是一篇文章可以容纳的。

OpenSSL 不只是 API,它还是一个命令行工具。命令行工具可以完成与
API 同样的工作,而且更进一步,可以测试 SSL
服务器和客户机。它还让开发人员对
OpenSSL 的能力有一个认识。

OpenSSL初接触的人恐怕最难的在于先理解各种概念

Openssl 操作指南


二、            CA概念描述

CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证
CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。

如果用户想得到一份属于自己的证书,他应先向
CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且
CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。

如果一个用户想鉴别另一个证书的真伪,他就用
CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。

  公钥/私钥/签名/验证签名/加密/解密/非对称加密

生成密钥

  • 生成私钥: openssl genrsa -out private.key 2048
  • 到出公钥: openssl rsa -in private.key -pubout -out public.key

genrsa       产生RSA密钥命令。
-out         输出路径,这里指private/server.key.pem。
2048         指RSA密钥长度位数,默认长度为512位。

二.1、           证书

证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。

证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X。509 国际标准。

如何在电子文档上实现签名的目的呢?我们可以使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下:

信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。

在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数) 生成的。对这些HASH函数的特殊要求是:

1.接受的输入报文数据没有长度限制;

2.对任何输入报文数据生成固定长度的摘要(数字指纹)输出;

3.从报文能方便地算出摘要;

4.难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;

5.难以生成两个不同的报文具有相同的摘要。

验证:

收方在收到信息后用如下的步骤验证您的签名:

1.使用自己的私钥将信息转为明文;

2.使用发信方的公钥从数字签名部分得到原摘要;

3.收方对您所发送的源信息进行hash运算,也产生一个摘要;

4.收方比较两个摘要,如果两者相同,则可以证明信息签名者的身份。

如果两摘要内容不符,会说明什么原因呢?

可能对摘要进行签名所用的私钥不是签名者的私钥,这就表明信息的签名者不可信;也可能收到的信息根本就不是签名者发送的信息,信息在传输过程中已经遭到破坏或篡改。

  我们一般的加密是用一个密码加密文件,然后解密也用同样的密码.这很好理解,这个是对称加密.而有些加密时,加密用的一个密码,而解密用另外一组密码,这个叫非对称加密,意思就是加密解密的密码不一样.初次接触的人恐怕无论如何都理解不了.其实这是数学上的一个素数积求因子的原理的应用,如果你一定要搞懂,百度有大把大把的资料可以看,其结果就是用这一组密钥中的一个来加密数据,可以用另一个解开.是的没错,公钥和私钥都可以用来加密数据,相反用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为签名和验证签名.

创建CA

CA是专门签发证书的权威机构,处于证书的最顶端。自签是用自己的私钥给证书签名,CA签发则是用CA的私钥给自己的证书签名来保证证书的可靠性

CA根证书的生成步骤:
生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。

  • 生成私钥: openssl genrsa -out ca.key 2048
  • 生成证书请求: openssl req -new -key ca.key -out ca.csr
  • 自签名: openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out
    ca.crt

以上操作合并操作如下:

openssl req -x509 -nodes -days 365    \
-newkey rsa:2048 -keyout ca.key -out ca.crt

其中重要参数含义如下:

 req
 -x509
 -nodes 本option被set的话,生成的私有密钥文件将不会被加密
 -days 365 
  • 查看自签名CA证书:openssl x509 -text -in ca.cert

二.2、           数字证书

数字证书为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。

  因为公钥加密的数据只有它相对应的私钥可以解开,所以你可以把公钥给人和人,让他加密他想要传送给你的数据,这个数据只有到了有私钥的你这里,才可以解开成有用的数据,其他人就是得到了,也看懂内容.同理,如果你用你的私钥对数据进行签名,那这个数据就只有配对的公钥可以解开,有这个私钥的只有你,所以如果配对的公钥解开了数据,就说明这数据是你发的,相反,则不是.这个被称为签名.

颁发证书

颁发证书就是用CA的秘钥给其他人签名证书,输入需要证书请求,CA的私钥及CA的证书,输出的是签名好的还给用户的证书.
用户的证书请求信息填写的国家省份等需要与CA配置一致,否则颁发的证书将会无效。

用户证书的生成步骤

生成私钥(.key)–>生成证书请求(.csr)–>CA的私钥及CA的证书签名得到用户证书(.crt)

  • 生成密钥: openssl genrsa -out client.key 2048
  • 生成请求: openssl req -new -subj -key client.key -out client.csr
  • 签发证书: openssl x509 -req -days 3650 -sha1 -extensions v3_req
    -CA
    ca.cert -CAkey ca.key -CAserial ca.srl -CAcreateserial -in
    client.csr -out client.cert

req          产生证书签发申请命令
-new         表示新请求。
-key         密钥,这里为client.key文件
-out         输出路径,这里为client.csr文件
-subj        指定用户信息

x509           签发X.509格式证书命令。
-req            表示证书输入请求。
-days          表示有效天数,这里为3650天。
-sha1           表示证书摘要算法,这里为SHA1算法。
-extensions    表示按OpenSSL配置文件v3_req项添加扩展
-CA            表示CA证书,这里为ca.cert
-CAkey         表示CA证书密钥,这里为ca.key
-CAserial      表示CA证书序列号文件,这里为ca.srl
-CAcreateserial表示创建CA证书序列号
-in            表示输入文件,这里为private/server.csr
-out           表示输出文件,这里为certs/server.cer
  • 验证CA颁发的证书提取的公钥和私钥导出的公钥是否一致
    openssl x509 -in server.cert -pubkey
  • 验证server证书openssl verify -CAfile ca.cert server.cert
  • 生成pem格式证书有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
    cat client.crt client.key > client.pem

二.3、           使用数字证书能做什么?

数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。

在线交易中您可使用数字证书验证对方身份。用数字证书加密信息,可以确保只有接收者才能解密、阅读原文,信息在传递过程中的保密性和完整性。有了数字证书网上安全才得以实现,电子邮件、在线交易和信用卡购物的安全才能得到保证。

  实际应用中,一般都是和对方交换公钥,然后你要发给对方的数据,用他的公钥加密,他得到后用他的私钥解密,他要发给你的数据,用你的公钥加密,你得到后用你的私钥解密,这样最大程度保证了安全性.

参考

  • OpenSSL Command-Line HOWTO:
    https://www.madboa.com/geek/openssl/
  • 基于 OpenSSL 自建 CA 和颁发 SSL 证书:
    http://www.jianshu.com/p/79c284e826fa
  • OpenSSL 标准命令详细解释 :
    http://blog.csdn.net/scuyxi/article/details/54884976
  • ssl.cnf
    配置文件参考:http://www.jinbuguo.com/linux/openssl\_install.html

二.4、           认证、数字证书和PKI解决的几个问题

l         保密性 – 只有收件人才能阅读信息。

l         认证性 – 确认信息发送者的身份。

l         完整性 – 信息在传递过程中不会被篡改。

l         不可抵赖性 – 发送者不能否认已发送的信息。

  RSA/DSA/SHA/MD5

三、            搭建SSL工作流程

(搭建OpenSSL)

(根证书获取方法图)

  非对称加密的算法有很多,比较著名的有RSA/DSA
,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名.至于SHA则是一种和md5相同的算法,它不是用于加密解密或者签名的,它被称为摘要算法.就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的,嗯….,正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了.

四、            开发

  实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的摘要值一起传给你.这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了,而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开.

四.1、           编译OpenSSL

   CA/PEM/DER/X509/PKCS

四.1.1、    搭建准备工作

1、 OpenSSL源代码,可以直接到官网下载最新代码。

2、 标准C编译器(可以用VC,这里使用的是VC),编译动态库。

3、 Perl5编译环境,OpenSSL编译需要Perl环境。官网有的下。

  一般的公钥不会用明文传输给别人的,正常情况下都会生成一个文件,这个文件就是公钥文件,然后这个文件可以交给其他人用于加密,但是传输过程中如果有人恶意破坏,将你的公钥换成了他的公钥,然后得到公钥的一方加密数据,不是他就可以用他自己的密钥解密看到数据了吗,为了解决这个问题,需要一个公证方来做这个事,任何人都可以找它来确认公钥是谁发的.这就是CA,CA确认公钥的原理也很简单,它将它自己的公钥发布给所有人,然后一个想要发布自己公钥的人可以将自己的公钥和一些身份信息发给CA,CA用自己的密钥进行加密,这里也可以称为签名.然后这个包含了你的公钥和你的信息的文件就可以称为证书文件了.这样一来所有得到一些公钥文件的人,通过CA的公钥解密了文件,如果正常解密那么机密后里面的信息一定是真的,因为加密方只可能是CA,其他人没它的密钥啊.这样你解开公钥文件,看看里面的信息就知道这个是不是那个你需要用来加密的公钥了.

四.1.2、    编译动态库

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文件。

  实际应用中,一般人都不会找CA去签名,因为那是收钱的,所以可以自己做一个自签名的证书文件,就是自己生成一对密钥,然后再用自己生成的另外一对密钥对这对密钥进行签名,这个只用于真正需要签名证书的人,普通的加密解密数据,直接用公钥和私钥来做就可以了.

四.2、           生成证书

由于OpenSSL的命令繁多,这里不详细说明。具体可以看:BBS水木清华站(FriNov1020:24:102000) fordesign@21cn.com翻译的内容。已经整理成文档放在目录中。

  密钥文件的格式用OpenSSL生成的就只有PEM和DER两种格式,PEM的是将密钥用base64编码表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件,直接打开,你可以看到……..你什么也看不懂!.X509是通用的证书文件格式定义.pkcs的一系列标准是指定的存放密钥的文件标准,你只要知道PEM
DER X509 PKCS这几种格式是可以互相转化的.

四.2.1、    生成服务器端的私钥(key文件)

openssl genrsa -des3 -out server。key 1024

运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法。),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令。如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施!

去除key文件口令的命令:

openssl rsa -in server.key -out server.key

== End ==

四.2.2、    生成证书请求

openssl req -new -key server.key -out server.csr -config openssl.cnf

生成Certificate Signing
Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书。屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可。

为了方便理解,我画了一个图,如下:

四.2.3、    生成客户key及csr文件

openssl genrsa -des3 -out client.key 1024

openssl req -new -key client.key -out client.csr -config openssl.cnf

 图片 1

四.2.4、    CA证书签证

CSR文件必须有CA的签名才可形成证书,可将此文件发送到verisign等地方由它验证。CA验证需要服务费,做测试使用可以自己生成。

openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

  1. 生成证书
    参考:
    一:生成CA证书
    目前不使用第三方权威机构的CA来认证,自己充当CA的角色。
    网上下载一个openssl软件
    1.创建私钥 :
    C:\OpenSSL\bin>openssl genrsa -out ca/ca-key.pem 1024
    2.创建证书请求 :
    C:\OpenSSL\bin>openssl req -new -out ca/ca-req.csr -key
    ca/ca-key.pem

四.2.5、    生成签证文件

用生成的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


四.2.6、    合成pem文件

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文件。

Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:root
Email Address []:sky
3.自签署证书 :
C:\OpenSSL\bin>openssl x509 -req -in ca/ca-req.csr -out
ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
4.将证书导出成浏览器支持的.p12格式 :
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in ca/ca-cert.pem
-inkey ca/ca-key.pem -out ca/ca.p12
密码:changeit
二.生成server证书。
1.创建私钥 :
C:\OpenSSL\bin>openssl genrsa -out server/server-key.pem 1024
2.创建证书请求 :
C:\OpenSSL\bin>openssl req -new -out server/server-req.csr -key

四.3、           Delphi接入

上面生成OpenSSL动态库我们现行可以直接加载使用。另外Indy组件封装了OpenSSL的功能模块,可以引用uIdSSLOpenSSLHeaders.pas单元文进行开发。

直接加载动态库开发比较烦琐,所以我们直接适用Indy提供的单元开发。Indy单元文件实现的版本比较老,因此新DLL加载会发生错误。在网上找到一个支持
0.9.7i OpenSSL较新动态库的Indy单元文件。

具体的开发应用可以看Source中的代码。

server/server-key.pem

Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:192.168.1.246
注释:一定要写服务器所在的ip地址
Email Address []:sky
3.自签署证书 :
C:\OpenSSL\bin>openssl x509 -req -in server/server-req.csr -out
server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem
-CAkey ca/ca-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in
server/server-cert.pem -inkey server/server-key.pem -out
server/server.p12
密码:changeit
三.生成client证书。
1.创建私钥 :
C:\OpenSSL\bin>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :
C:\OpenSSL\bin>openssl req -new -out client/client-req.csr -key

四.3.1、    服务器端调用流程

client/client-key.pem

Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:sky
Email Address []:sky 注释:就是登入中心的用户(本来用户名应该是Common
Name,但是中山公安的不知道为什么使用的Email
Address,其他版本没有测试)
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:tsing
3.自签署证书 :
C:\OpenSSL\bin>openssl x509 -req -in client/client-req.csr -out
client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem
-CAkey ca/ca-key.pem -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :
C:\OpenSSL\bin>openssl pkcs12 -export -clcerts -in
client/client-cert.pem -inkey client/client-key.pem -out
client/client.p12
密码:changeit

请一定严格根据里面的步骤来,待实验成功后,修改你自己想要修改的内容。我就是一开始没有安装该填写的来,结果生成的证书就无法配对成功。

四.3.2、    客户段调用流程

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注