数字签名证书的事儿(转)
-
CA:有一个“自签名”的证书,大家公认;可以用这个CA证书签名自己私有证书;若浏览器信任这个CA证书,则也信任这个CA证书签名过的私有证书。
- 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的)。
- 共用的CA_ROOT的服务不是免费的。而且价格不菲。所以我们有必要自己生成一个CA_ROOT的密钥对,然后部署应用时,只要把这个CA_ROOT的私钥部署在所有节点就可以完成验证了。
- 服务器端证书的签名是通过签名算法和CA的私钥生成的
********************
keystore
是一个密码保护的文件,用来存储密钥和证书(也就是说,keystore中存储的有两类型entries);这个文件(默认的)位于你的home目录,也就是你登录到操作系统的用户名的那个目录。或者通过-keystore参数设为你指定的位置。需要说明的是:如果不通过-keystore来指定位置,将使用home目录中的默认keystore文件。smilingleo原创
通过-alias来检索keystore中的具体内容(keystore中可能存有多个entry)
如果想查看keystore中每个entry的详细信息,比如谁签发的,用-v参数(verbose),里面你还可以看到默认的有效期。
系统签署的证书其有效期默认为一年,通过-validity来设定其具体的天数。
重要:JDK/jre/lib/security目录下面有一个cacerts的文件,就是一个keystore,其默认密码是changeit。如果一个App Server想建立一个安全的链接到另外一个Server,需要通过一个受信的数字证书,而这个证书就需要存储在cacerts中。
***************************************
https连接过程
1. 客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8. 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。
***************************
怎么用openssl来完成一个CA的功能,并且签发一个apache可以使用的SSL证书
0x1: CA认证中心准备
我们首先要明白,要进行一个证书的签发工作,第一步要做的就是进行CA认证中心的准备工作,CA负责对请求证书(CSR)进行签名,有两种选择
1. 选择市场上公认的权威性的CA中心
1. WebTrust http://www.webtrust.net/ 2. GlobalSign http://cn.globalsign.com/ http://globalsign.tbs-certificats.com/ 3. GTE http://certificate.fyicenter.com/335_Root_CA_GTE_CyberTrust_Global_Root_GTE_CyberTrust_Solutions.html 4. Nortel http://www.nortel.com/ 5. Verisign http://www.verisign.com/
选择权威的CA进行证书签发的好处就是目前大多数的浏览器都会预装内置了这些权威CA的公钥证书,这样,在使用这些权威CA签发过的证书的时候,浏览器一般不会报风险提示
相反,如果我们的证书的签发机构不是一个权威机构,浏览器在访问的时候就会报风险提示
2. 本机搭建CA认证中心
我们同样可以使用openssl在本机搭建CA认证中心
/* 1. 建立CA目录结构 按照OpenSSL的默认配置建立CA,需要在文件系统中建立相应的目录结构。相关的配置内容一般位于/usr/ssl/openssl.cnf内 -- demoCA/ |-- index.txt |-- newcerts/ |-- private/ |-- serial 2. 生成CA证书的RSA密钥对 我们知道,要利用公钥机制,必要需要先建立密钥文件 3. 生成CA证书请求 4. 对CA证书请求进行自签名 (3、4两步可以合并执行) */ mkdir -p ./demoCA/{private,newcerts} touch ./demoCA/index.txt echo 01 > ./demoCA/serial cp /usr/lib/ssl/openssl.cnf ./ openssl genrsa -out ./demoCA/private/cakey.pem 2048 openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem ..按照提示填写申请者身份信息.. //openssl中有些指令可以为一条指令(3、4步骤可以合并到以下一步完成) openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem
0x2: 服务端证书准备
要配置apache的SSL通信,需要为apache配置服务端的"服务器根证书"
/* 1. 生成服务端证书的RSA密钥对 和根CA一样,生成服务端证书同样也是使用RSA机制,自然也需要为服务端生成一个RSA私钥文件(但不能和CA的一样) 2. 生成服务端证书请求 4. 查看刚才生成的请求签发证书 3. 使用CA根书对"服务端请求签发证书文件"进行签名 */ openssl genrsa -out serverkey.pem openssl req -new -days 3650 -key serverkey.pem -out serverreq.pem ..填写证书申请者的身份信息..(common name不能为空,申请证书的countryName必须和CA的countryName相同) openssl req -noout -text -in serverreq.pem openssl ca -in serverreq.pem -out servercert.pem -config openssl.cnf (如果在签发的时候遇到异常,记得到openssl.cnf配置文件中查看是否是配置项出了问题)
0x3: 配置apache的SSL证书
http://www.metsky.com/archives/561.html /* 1. 加载SSL模块 2. 配置apache的ports.conf文件 3. 设置site-enabled 4. 修改配置文件 5. 重启APACHE */ sudo a2enmod ssl 这条命令相当于 sudo ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled sudo ln -s /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled 如果没有a2enmod指令,也可直接在apache2.conf中设置SSL模块加载: LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so vim /etc/apache2/ports.conf 加入443端口 Listen 443 ln -s /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/001-ssl vim /etc/apache2/sites-enabled/001-ssl 把端口改为443,在<Virtualhost>下加入SSL认证配置,其它的根据需要自己定制 与普通配置无异 NameVirtualHost *:443 <VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/apache2/ssl/servercert.pem
SSLCertificateKeyFile /etc/apache2/ssl/server.key ServerAdmin webmaster@localhost DocumentRoot /var/www ServerName myServerName <Directory /> Options FollowSymLinks AllowOverride All </Directory> <Directory /var/www/> Options FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all # This directive allows us to have apache2's default start page # in /apache2-default/, but still have / go to the right place #RedirectMatch ^/$ /apache2-default/ </Directory>
</VirtualHost>
cd /etc/apache2/ssl/
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out servercert.pem
/etc/init.d/apache2 restart
0x4: 配置客户端的SSL证书
客户端证书并不一定需要,只有在服务端配置了一个"验证客户端选项"的时候,才需要配置客户端证书,在大多数情况下都不需要客户端证书
整个CA架构如下图所示
转:https://www.cnblogs.com/LittleHann/p/3738141.html
*******************************************
在Java中使用openssl制作的双向认证
一 创建根证书
1 生成根证书私钥
openssl genrsa -des3 -out root.key 1024
密码为:handwin1
2 生成根证书签名请求文件
openssl req -new -out root-req.csr -key root.key -keyform PEM
3 自签根证书
openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root.key -CAcreateserial -days 7300
4 导出p12格式证书
openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root.key -out root.p12
二 创建服务端证书
1.生成服务端key
openssl genrsa -des3 -out server-key.key 1024
2.生成服务端请求文件
openssl req -new -out server-req.csr -key server-key.key
3.生成服务端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer -CAkey root.key -CAcreateserial -days 7300
4.生成服务端p12格式根证书
openssl pkcs12 -export -clcerts -in server-cert.cer -inkey server-key.key -out server.p12
三 创建客户端证书
1.生成客户端key
openssl genrsa -des3 -out client-key.key 1024
2.生成客户端请求文件
openssl req -new -out client-req.csr -key client-key.key
3.生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer -CAkey root.key -CAcreateserial -days 7300
4.生成客户端p12格式根证书
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
转 https://blog.csdn.net/u012333307/article/details/21597101
*****************************
证书包含的内容
1. 证书版本号(Version) 版本号指明X.509证书的格式版本,现在的值可以为: 1) 0: v1 2) 1: v2 3) 2: v3 也为将来的版本进行了预定义 2. 证书序列号(Serial Number) 序列号指定由CA分配给证书的唯一的"数字型标识符"。当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中,这也是序列号唯一的原因。 3. 签名算法标识符(Signature Algorithm) 签名算法标识用来指定由CA签发证书时所使用的"签名算法"。算法标识符用来指定CA签发证书时所使用的: 1) 公开密钥算法 2) hash算法 example: sha1WithRSAEncryption 须向国际知名标准组织(如ISO)注册 4. 签发机构名(Issuer) 此域用来标识签发证书的CA的X.500 DN(DN-Distinguished Name)名字。包括: 1) 国家(C) 2) 省市(ST) 3) 地区(L) 4) 组织机构(O) 5) 单位部门(OU) 6) 通用名(CN) 7) 邮箱地址 5. 有效期(Validity) 指定证书的有效期,包括: 1) 证书开始生效的日期时间 2) 证书失效的日期和时间 每次使用证书时,需要检查证书是否在有效期内。 6. 证书用户名(Subject) 指定证书持有者的X.500唯一名字。包括: 1) 国家(C) 2) 省市(ST) 3) 地区(L) 4) 组织机构(O) 5) 单位部门(OU) 6) 通用名(CN) 7) 邮箱地址 7. 证书持有者公开密钥信息(subject PublicKey Info) 证书持有者公开密钥信息域包含两个重要信息: 1) 证书持有者的公开密钥的值 2) 公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。 8. 扩展项(extension) X.509 V3证书是在v2的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都
可以向一些权威机构,如ISO,来注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。 9. 签发者唯一标识符(Issuer Unique Identifier) 签发者唯一标识符在第2版加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串来唯一标识签发者的X.500名字。可选。 10. 证书持有者唯一标识符(Subject Unique Identifier) 持有证书者唯一标识符在第2版的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时,用一比特字符串来唯一标识证书持有者的X.500名字。可选。 11. 签名算法(Signature Algorithm) 证书签发机构对证书上述内容的签名算法 example: sha1WithRSAEncryption 12. 签名值(Issuer's Signature) 证书签发机构对证书上述内容的签名值
********************************************************
1.证书和编码
X.509 这是一种证书标准,主要定义了证书中应该包含哪些内容,其详情可以参考RFC5280,SSL使用的就是这种证书标准
2.X509 File Extensions
2.1 编码格式:
同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式,
a. PEM ---Privacy Enhanced Mail, 打开看文本格式,以"-----BEGIN...."开头,"------END......" 结尾,内容是BASE64编码.
b。 DER --Distinguished Encoding Rules, 打开看是二进制格式, 不可读,Proper English usage would be “I have a DER encoded certificate” not “I have a
DER certificate”.
2.2 相关的扩展名
虽然知道有PEM和DER这两种编码格式,但文件扩展名不一定就叫“PEM” 或者”DER“, 常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换
a. CRT ---certificate 的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数是PEM编码
b. CER --还是certificate,还是证书,常见于Windows 系统, 同样的,可能是PEM编码,也可能是DER编码,大多数是DER编码, CER & CRT 几乎是同义词
c. KEY-- 通常用来存放一个公钥或者私钥,并非X.509证书, 编码同样的,可能是PEM,也可能是DER
查看KEY的方法: openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了: openssl rsa -in mykey.key -text -noout -inform der
d.CSR --Certificate Signing Request, 即证书签名请求,这个并不是证书, 而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥,在生成这个申请的时候,同时也会生成一个私钥,私钥自己保存好
查看到办法: openssl req -noout -text in my.csr(如果是DER格式的话就加上 -inform der )
e.PFX/P12--predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但是windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书以及私钥,通常也很安全,因为当你要读取里面的东西的 话,需要提供密码),将P12转化为PEM编码
openssl pkcs12 -in *.p12 -out *.pem -nodes [-password pass:yourpassword]
反向生成p12: openssl pkcs12 -export -in cetificate.crt -inkey private.key -out certificate.p12 -certifile CACert.crt
其中CACert.crt 是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去。
f. JKS: Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用java的一个叫“keytool”的工具。
2.3 View PEM 编码的证书
openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout
2.4 View DER 编码的证书
openssl x509 -in certificate.der -inform der -text -noout
2.5 PEM 转换为DER
openssl x509 -in cert.crt -outform der -out cert.der
2.6 DER 转换为PEM
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
提示:要转换KEY文件也类似,只不过把x509换成rsa, 要转CSR的话,把x509换成req
3.获得证书,两种工具keytool,openssl
3.1 keytool 的使用方法
keytool 是java自带的一种工具,在JDK1.4以后都包含了这一工具
引用自 http://blog.csdn.net/wzyzzu/article/details/44746385
3.11.创建证书
keytool -genkeypair -alias "test1" -keyalg "RSA" --keystore "test.keystore"
创建了一个别名为test1的证书条目,该条目存放在名为 test.keystore 的密钥库中,若test.keystore 密钥库不存在则创建.
参数说明;
-genkeypair:生成一对非对称密钥;
-alias:指定密钥对的别名,该别名是公开的;
-keyalg:指定加密算法,本例中采用通用的RAS加密算法;
-keystore 密钥库的路劲及名称,不指定的话,默认在操作系统的用户目录下生成一个".keystore"的文件
注意: 名字和姓氏应该是域名,而不是姓名
3.12. 查看证书
keytool --list -keystore test.keystore
3.13. 导出到证书文件
keytool -export -alias test1 -file test.crt -keystore test.keystore
将名为test.keystore 的证书库中别名为test1d的证书条目导出到证书文件test.crt 中
3.14.导入证书的信息
keytool -import -keystore test_cacerts -file test.crt
将证书文件test.crt 导入到名为 test_cacerts 的证书库中
3.15.查看证书信息
keytool -printcert -file "test.crt"
查看证书文件test.crt 的信息
3.16. 删除密钥库中的条目
keytool -delete -keystore test.keystore -alias test1
3.17.修改证书条目的口令
keytool -keypasswd -alias test1 -keypass testtesttest1 -new testtest1 -storepass testtest -keystore test.keystore
将密钥库test.keystore 中别名为test1的证书条目的密码修改为testtest1
keytool -keypasswd -alias test1 -keystore test.keystore(交互式修改)
删除密钥库test.keystore中别名为test1的证书条目
3.2 openssl 使用方法
简单地说,OpenssL是SSL的一个实现,SSL只是一种规范, 理论上来说,SSL这种规范是安全的,目前的技术水平很难破解,但SSL的实现就可能有些漏洞,
如著名的“心脏出血”,OpenSSL还提供了一大堆强大的工具软件
向权威证书颁发机构申请证书
用这个命令生成一个csr: openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out.csr
把csr交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成,保留好csr,当权威证书颁发机构颁发的证书过期的时候,可以用同样的csr来申请新的证书, 可以保持不变
或者生成自签名证书:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
3.3 keytool 和 openssl的区别和转换
keytool 不支持导出私钥,java只能使用密钥库(jks)中包含的证书/密钥,这些证书和密钥是使用keytool生成的,而不是openssl。
keytool和Openssl生成的证书之间无法识别,keytool生成的为jks文件,openssl默认生成的为PEM格式文件,两者之间需要转换,
首先需要转换为 pkcs12 格式,然后在使用对方的命令去转换成需要的格式
PEM格式的证书转换为jks格式的证书
PME---->pkcs12--->jks
openssl pkcs12 -export -in public.crt -inkey private.pem -out serer.p12 -name server -passin pass:${passwd} -passout pass:${passwd}
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass ${Passwd} -alias server -deststorepass ${passwd} -destkeystore ServerCert.jks
转:https://www.cnblogs.com/frankb/p/7521775.html