数字证书相关
1. PKI / CA:
PKI:Public Key Infrastructure,公钥基础设施。是基于公私钥密码体系的一种身份认证技术。
CA:
CA:负责发放和管理数字证书的权威机构。防止有人散布伪造的公钥骗取信任。
CA:用来认证用户公钥的。
CA:Certificate Authority,即证书颁发机构。负责发放和管理数字证书的权威机构。数字签名使得攻击者不能伪造和篡改证书。
2. 数字证书:
数字证书:是由一个权威机构发行的,至少包含一个公开密钥、证书持有人(或单位)的名称以及证书授权中心对这些信息的数字签名的文件。一般情况下证书中还包括密钥的有效时间,发证机关(证书授权中心)的名称,该证书的序列号等信息,证书的格式遵循ITUT X.509国际标准。
数字证书:用来验证网站的安全性。还可以用来验证某个文件是否被篡改。
数字证书的生成:
1. A的公钥 + A的一些信息 = 给到CA.
2. CA的私钥 + A的公钥 = 生成签名A。
3. A的公钥 + 签名A + A的一些信息 = 生成证书,给到A。
数字证书的应用:
服务端:CA的私钥 + 服务端的公钥 + 服务器的一些相关信息 = 服务端的数字证书。
客户端:CA的私钥 + 客户端的公钥 + 客户端的一些相关信息 = 客户端的数字证书。
数字证书颁发过程:
用户产生了自己的密钥对,并将公共密钥及部分个人身份信息(称作P10请求)传送给一家认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内附了用户和他的密钥等信息,同时还附有对认证中心公共密钥加以确认的数字证书。当用户想证明其公开密钥的合法性时,就可以提供这一数字证书。
数字证书的格式:
.cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。cer格式的数字证书里面只有公钥没有私钥。
.pem跟crt/cer的区别是它以Ascii来表示。
pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式。包含了公钥和私钥的二进制格式的证书形式。
p10是证书请求
p7r是CA对证书请求的回复,只用于导入
p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
数字证书的命名:
C(county) 国家
O(organization)颁发机构名称
OU(Organizational Unit) 组织单位名称
CN (common name) 持有者的名称
例如:CN=zhangsan,OU=beijingICBCbank,O=ICBCbank
证书工具使用:
Java自带的keytool工具是个密钥和证书管理工具。
keytool 将密钥和证书储存在一个所谓的密钥仓库(keystore)中。
数字证书:
3. 单向认证、双向认证:
a. 单向认证:只要求站点部署了ssl证书就行,任何用户都可以去访问(IP被限制除外等)只是服务端提供了身份认证。单向认证SSL协议不需要客户端拥有CA证书。
b. 双向认证:则是服务端需要客户端提供身份认证,只能是服务端允许的客户能去访问,安全性相对于要高一些。
c. https 单项认证、双向认证 https://www.cnblogs.com/sunzhao/p/9081272.html
4. 对称加密、非对称加密、对比:
何谓加密?加密是一种“把数据搞乱掉”的技术。加密技术涉及到4种东东:
明文:可以被人或程序识别的数据。例如一个文本文件、一段歌词、一个Word文档、一首MP3、一个图片文件、一段视频等等。
加密算法:将数据搞乱掉的方法。
密钥(密码):一个你在进行加密操作时给出的字符串,让加密算法不但把明文“搞乱掉”,而且要乱得“与众不同”。这样即使别人搞到了解密算法,如果没有当初加密时所使用的密码,一样无法进行解密操作。
密文:明文被加密算法和密钥加密后的结果。它看上去就是一堆乱码,没有人或程序能知道它到底表示什么信息。
对称加密:
加密和解密使用的是同一把钥匙。
加密:原文 + 密匙 = 密文
解密:密文 - 密匙 = 原文
优点:算法简单,加密解密容易,效率高,执行快。
缺点:相对来说不算特别安全,只有一把钥匙。密文如果被拦截,且密钥也被劫持,那么,信息很容易被破译。
非对称加密:
非对称加密有两个钥匙,及公钥(Public Key)和私钥(Private Key)。
对原文使用公钥加密,则只能使用对应的私钥才能解密。
优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。
缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。
对比:
1. 对称加密的弊端是难以安全地传递密钥。
2. 非对称加密的弊端是加密和解密的花费时间长,如果通讯中所有数据都使用非对称加密,将会引起性能问题。
3. 如果结合两者,使用机构认证和非对称加密的方式解决密钥传递的问题,使用对称加密的方式来解决加解密费时问题,就能达到性能优化的目的。
数字信封:
加密解密:
5. 公钥、私钥:
私钥签名,公钥验签。
公钥加密,私钥解密。
对称加密,非对称加密的代码;
防篡改:由于我发给Clark的是密文,Clark无法进行修改。Clark倒是可以修改解密后的借条,但是Clark没有我的私钥,没法模仿我对借条进行加密。
防抵赖:由于用我的私钥进行加密的借条,有且只有我的公钥可以解密。反过来讲,能用我的公钥解密的借条,一定是使用我的私钥加密的,而只有我才拥有我的私钥,这样Clark就可以证明这个借条就是我写的。
6. 数字签名:
白话数字签名:
公钥用来加密信息,私钥用来数字签名。
1. 原文Hash后,形成摘要Digest.
2. 摘要Digest用私钥加密后。形成数字签名Signature.
3. 原文+签名,发给了对方。对方将,原文Hash后得到的摘要,与对签名用公钥解密后得到的摘要对比,就知道内容是否被篡改过。
原理:
A计算机给B计算机传输信息的时候,A计算机在信息后面加自己的签名(字符串),用自己的私钥(privatekey)加密。
B计算机接到数据后,用A计算机的公钥(publickey)解密,确认来源是不是A计算机。
这样确保了`完整性`,而且A计算机也`不可抵赖`
(因为用A计算机公钥解密的信息只能是A计算机的私钥加密的信息)
验证签名:
然后把加密后的散列值(我们就叫它“散列值密文”吧)和借条一同发送到Clark那里。Clark在收到借条和散列值密文后,用从网上下载的我的公钥将散列值解密,然后Clark自己再生成一次借条的散列值,比对这两个散列值是否相同,如果相同,就叫作验证签名成功。
数字签名实例:
(1)将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。
(2)将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名。这样就保证了签发者不可否认性。
(3)接收方收到数字签名后,用同样的HASH算法对报文计算摘要值,然后与用发送者的公开密钥进行解密解开的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。
7. 客户端访问服务端、流程:
8. https、http、ssl、tls:
1. 网站要实现https加密,需要申请SSL证书。
2. ssl证书分类:
验证级别分类: 域名认证(Domain Validation):最低级别认证,可以确认申请人拥有这个域名。对于这种证书,浏览器会在地址栏显示一把锁。 公司认证(Company Validation):确认域名所有人是哪一家公司,证书里面会包含公司信息。 扩展认证(Extended Validation):最高级别的认证,浏览器地址栏会显示公司名。 覆盖级别分类: 单域名证书:只能用于单一域名,foo.com的证书不能用于www.foo.com 通配符证书:可以用于某个域名及其所有一级子域名,比如*.foo.com的证书可以用于foo.com,也可以用于www.foo.com 多域名证书:可以用于多个域名,比如foo.com和bar.com
3. http:
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方可以获知通信内容。 (2) 篡改风险(tampering):第三方可以修改通信内容。 (3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。 (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。 (3) 配备身份证书,防止身份被冒充。
4. https:
https使用了SSL/TLS协议的基本过程:
(1) 客户端向服务器端索要并验证公钥。 (2) 双方协商生成"对话密钥"。 (3) 双方采用"对话密钥"进行加密通信。
9. 验证证书有效期:
默认会验证:
1. 代码里面没有设置:不验证证书。默认会验证得。https://www.cnblogs.com/doit8791/p/7684926.html
2. nginx里面没有设置:不验证证书有效期。默认会验证得。https://blog.csdn.net/h106140873/article/details/78924539?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-78924539.nonecase&utm_term=nginxssl%E8%AF%81%E4%B9%A6%E8%BF%87%E6%9C%9F
10. 常见的加密算法:
对称加密算法:DES、3DES、AES。WinRAR的文件加密功能就是使用的AES加密算法。
非对称加密算法:RSA、DSA、ECC(椭圆曲线)算法。RSA: 数学原理是将一个大数分解成两个质数的乘积。
摘要算法,又叫 Hash算法、散列算法:SHA-1、MD5;是一种将任意长度的输入浓缩成固定长度的字符串的算法,注意是“浓缩”而不是“压缩”,因为这个过程是不可逆的。
11. 申请证书:
Nginx配置需要: 1. server.crt (ssl_certificate) 2. nopass.key (ssl_certificate_key) 3. genCA.crt (根证书) 4. pt2CA.crt (二级证书) =============================================== 格式转换: 1. xxx.cer(CA给的) 转成 xxx.crt(证书) openssl x509 -inform DER -in certificate.cer -out certificate.crt openssl x509 -inform PEM -in certificate.cer -out certificate.crt 2. 生成 xxx.pfx 由 xxx.key(私钥)+ xxx.crt(证书) + beijing2CA.crt(二级链) + genCA.crt(根链) openssl pkcs12 -export -out example.pfx -inkey nclient.key -in nclient.crt -certfile beijing2CA.crt -certfile genCA.crt 3. 由 xxx.pfx 反解为 xxx.key 和 xxx.crt openssl pkcs12 -in ***.pfx -nodes -out ***.pem openssl rsa -in ***.pem -out ***.key openssl x509 -in ***.pem -out ***.crt =============================================== 申请证书-操作流程: 1.生成P10.key pri.key pub.key —— 不采用(因为CA说:算法不是RSA,而是SM2.) a.//生成私钥 openssl genrsa -des3 -passout pass:$PassWord(密码) -out pri.key(输出文件名) 2048 or: openssl genrsa -des3 -out pri.key 2048 xxx(密码) b.//生成P10请求 openssl req -new -key pri.key(私钥) -passin pass:Ruyixing2017(私钥密码) -out P10.key(输出文件名) -subj ${SUB_NAM} (一般填行业代码等信息,如/C=CN 等) or: openssl req -new -key pri.key -passin pass:xxx(密码) -out P10.key ${SUB_NAM} (一般填行业代码等信息,如/C=CN 等) c.//从私钥提取公钥 openssl rsa -in pri.key -pubout -out pub.key or: openssl rsa -in pri.key -pubout -out pub.key xxx(密码) 2.生成xxx —— 不采用(因为CA说:算法不是RSA,而是SM2.) openssl req -new -nodes -newkey rsa:2048 -keyout domain.key -out domain.csr or:(未用) openssl req -newkey rsa:2048 -keyout PRIVATEKEY.key -out MYCSR.csr 3.生成xxx.csr xxx.jks —— 采用 a.进入 Java_JRE\bin 目录,如 cd C:\PROGRA~1\Java\jre1.5.0_06\bin,运行如下命令: keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -keystore ./server.jks (输入 keystore 密码,务必牢记此密码) keytool -certreq -alias tomcat -keystore server.jks -file certreq.csr b.xxx.csr文件提交给CA.返回xxx.cer文件.转成xxx.crt文件. openssl x509 -inform DER -in certificate.cer -out certificate.crt or: openssl x509 -inform PEM -in certificate.cer -out certificate.crt c.CA返回xxx.cer keytool -import -trustcacerts -keystore c:\server.jks -alias inter -file intermediate.cer (证书已添加到密钥库中,密码是生成文件时牢记的密码;) keytool -import -trustcacerts -keystore c:\server.jks -alias tomcat -file server.cer (证书回复已安装在密钥库中,密码是生成文件时牢记的密码;) 完成后:表示证书已经完全安装到 server.jks 这个文件中,请备份此文件并妥善保存,以后如有更换服务器或重装系统,就可以直接使用此文件。 d.更新server.xml配置文件: 用文本编辑器打开 Tomcat 目录下的 server.xml 找到去除注释并更新以下内容: <!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -- > <Connectorprotocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" maxThreads="200" scheme="https" secure="true" SSLEnabled="true" keystoreFile="c:\server.jks" keystorePass="changeit" clientAuth="false" sslProtocol="TLS"/> 如果你要使用默认的 SSL 端口,请将 8443 端口改为 443 端口,keystoreFile 和 keystorePass 是 JKS 文件对应的路径和密码。 注意:不同 tomcat 版本,修改 server.xml 的方式略有不同,请参考 tomcat 说明 tomcat 9.0 http://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html tomcat 8.0 http://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html tomcat 7.0 http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html tomcat 6.0 http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html tomcat 5.5 http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html tomcat 4.1 http://tomcat.apache.org/tomcat-4.1-doc/ssl-howto.html 按照以上的步骤配置完成后,重新启动 TOMCAT 后就可以使用 https://www.domain.com 来访问了 OR: 到c步骤时:(提取key和crt文件从jks文件) keytool -export -alias tomcat -file server.der -keystore server.jks openssl x509 -inform der -in server.der -out server.crt keytool -importkeystore -srckeystore server.jks -destkeystore keystore.p12 -deststoretype PKCS12 openssl pkcs12 -in keystore.p12 -nodes -nocerts -out server.key Last: 将xxx.key xxx.crt 配置到Nginx中。 =============================================== 导证书链: 将CA的根链和二级链导入jdk中:进入到代码运行环境下jdk中jre的lib下security文件夹 keytool -import -alias gen -keystore cacerts -file "D:\genCA.cer" keytool -import -alias pt2 -keystore cacerts -file "D:\pt2.cer"
12. 模拟CA自己颁发证书:
https://baijiahao.baidu.com/s?id=1649462735958571118&wfr=spider&for=pc 1、创建密钥 openssl genrsa -des3 -out server.key 2048 2、生成CSR(证书签名请求) openssl req -new -key server.key -out server.csr 3、删除密钥中的密码 openssl rsa -in server.key -out server.key 4、生成自签名证书 openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 5、生成pem格式的公钥 openssl x509 -in server.crt -out server.pem -outform PEM