自签名证书和CA证书的区别和制作、使用

摘要:
2)数字证书所谓数字证书,是一种用于电脑的身份识别机制。3)自签证书的区别自签名私有证书VS私又CA自签名证书自签名证书分为自签名私有证书和自签名CA证书两种,区别是私有证书无法被吊销,自签的CA证书可以被吊销。申请权威机构的CA证书VS自签名CA证书1、权威CA机构申请的证书要花银子,自签证书不要银子2、自签证书会出现google浏览器不认的情况,比较麻烦。

一、概念介绍

1)传输协议

HTTP(超文本传输)协议访问互联网上的数据是没有经过加密的。也就是说,任何人都可以通过适当的工具拦截或者监听到在网络上传输的数据流。但是有时候,我们需要在网络上传输一些安全性或者私秘性的数据,譬如:包含信用卡及商品信息的电子订单。这个时候,如果仍然使用HTTP协议,势必会面临非常大的风险!相信没有人能接受自己的信用卡号在互联网上裸奔。
HTTPS(超文本传输安全)协议无疑可以有效的解决这一问题。所谓HTTPS,其实就是HTTP和SSL/TLS的组合,用以提供加密通讯及对网络服务器的身份鉴定。HTTPS的主要思想是在不安全的网络上创建一安全信道,防止黑客的窃听和攻击。
SSL(安全套接层)可以用来对Web服务器和客户端之间的数据流进行加密。
SSL利用非对称密码技术进行数据加密。加密过程中使用到两个秘钥:一个公钥和一个与之对应的私钥。使用公钥加密的数据,只能用与之对应的私钥解密;而使用私钥加密的数据,也只能用与之对应的公钥解密。因此,如果在网络上传输的消息或数据流是被服务器的私钥加密的,则只能使用与其对应的公钥解密,从而可以保证客户端与与服务器之间的数据安全。

2)数字证书

所谓数字证书,是一种用于电脑的身份识别机制。由数字证书颁发机构(CA)对使用私钥创建的签名请求文件做的签名(盖章),表示CA结构对证书持有者的认可。数字证书拥有以下几个优点:
使用数字证书能够提高用户的可信度
数字证书中的公钥,能够与服务端的私钥配对使用,实现数据传输过程中的加密和解密
在证认使用者身份期间,使用者的敏感个人数据并不会被传输至证书持有者的网络系统上
X.509证书包含三个文件:key,csr,crt。

key是服务器上的私钥文件,用于对发送给客户端数据的加密,以及对从客户端接收到数据的解密
csr是证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名
crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息
备注:在密码学中,X.509是一个标准,规范了公开秘钥认证、证书吊销列表、授权凭证、凭证路径验证算法等。

3)自签证书的区别

自签名私有证书VS私又CA自签名证书

自签名证书分为自签名私有证书和自签名CA证书两种,区别是私有证书无法被吊销,自签的CA证书可以被吊销。能不能吊销证书的区别我理解是CA证书有一套证书吊销机制,可以决定什么情况吊销证书,而私有证书没有这种安全机制(数据完整性,过期时间之类的吧),对于被劫持的风险更高(参考资料)(使用自签的系统有几个是重要的,况且即便是自签的证书也会被浏览器提示未认证的签名机构,不过有的浏览器可能对于私有证书这种认证会直接拒绝连提示的机会都不给)
再一个区别就是需要创建多个客户端证书的时候,推荐使用CA证书,因为只要给所有的客户端(有待推敲)都安装了 CA 根证书,那么以该 CA 根证书签名过的客户端证书都是信任的,不需要重复的安装客户端证书。

申请权威机构的CA证书VS自签名CA证书

1、权威CA机构申请的证书要花银子,自签证书不要银子
2、自签证书会出现google浏览器不认的情况,比较麻烦。漏洞也多,对安全不利。
3、使用机构签发的证书时候需要联网签发,内网机器不用想

所以公网服务踏实的买证书,内网机器踏实的自签证书。

4)证书类型

x509的证书编码格式有两种
1.PEM(Privacy-enhanced Electronic Mail) 是明文格式的 以 -----BEGIN CERTIFICATE-----开头,已-----END CERTIFICATE-----结尾,中间是经过base64编码的内容,apache需要的证书就是这类编码的证书 查看这类证书的信息的命令为 :openssl x509 -noout -text -in server.pem
其实PEM就是把DER的内容进行了一次base64编码
2.DER 是二进制格式的证书 查看这类证书的信息的命令为 :openssl x509 -noout -text -inform der -in server.der

扩展名:
.crt 证书文件 ,可以是DER(二进制)编码的,也可以是PEM( ASCII (Base64) )编码的 ,在类unix系统中比较常见
.cer 也是证书 常见于Windows系统 编码类型同样可以是DER或者PEM的,windows 下有工具可以转换crt到cer
.csr 证书签名请求 一般是生成请求以后发送给CA,然后CA会给你签名并发回证书
.key 一般公钥或者密钥都会用这种扩展名,可以是DER编码的或者是PEM编码的 查看DER编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform DER -noout -text -in xxx.key 查看PEM编码的(公钥或者密钥)的文件的命令为 openssl rsa -inform PEM -noout -text -in xxx.key
.p12 证书 包含一个X509证书和一个被密码保护的私钥

二、制作自签证书

1)自签私有证书

1.生成证书私钥(Key)
openssl genrsa -des3 -out server.key 2048
生成rsa私钥,des3算法,2048位强度,server.key是秘钥文件名。生成私钥的时候会要求提供一个至少4位数的序列号就当是密码吧。
2.生成CSR(证书签名请求)
openssl req -new -key server.key -out server.csr
此时可以将证书发送给证书颁发机构(CA),CA验证过请求者的身份之后,会出具签名证书。还有就是自建一个私有CA做认证。再者就是用OpenSSL实现自签名,私有认证。
生成 CSR 的过程中,会提示输入一些信息,包括:序列号、公钥、用户名称、签发者、CA签名和其他一些附属信息等。
证书验证过程就是依赖于这信息和公钥对应的私钥进行。
其中一个提示是 Common Name (e.g. YOUR name),这个非常重要,这一项应填入 FQDN(Fully Qualified Domain Name)完全合格域名/全称域名,
如果您使用 SSL 加密保护网络服务器和客户端之间的数据流,举例被保护的网站是 https://test.example.cn,那么此处 Common Name 应输入 test.example.cn
3.删除私钥中的密码
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
4.生成自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
5、安装私钥和证书
将私钥和证书文件复制到Apache的配置目录下即可。
以上1-4步也可以使用一条命令执行完成:
openssl req -new -x509 -newkey rsa:2048 -keyout /root/ca/server.key -out /root/ca/server.crt

2)私有CA认证

私有CA就是自己创建一个CA根证书代替权威CA机构,然后用私有的根证书签发客户端证书
创建CA根证书
centos默认安装了openssl,看一下目录
/etc/pki/CA /etc/pki/tls
自签名证书和CA证书的区别和制作、使用第1张

/etc/pki/CA/
    newcerts    存放CA签署(颁发)过的数字证书(证书备份目录)
    private     用于存放CA的私钥
    crl 吊销的证书

/etc/pki/tls/
    cert.pem    软链接到certs/ca-bundle.crt
    certs/      该服务器上的证书存放目录,可以放自己的证书和内置证书
    ca-bundle.crt    内置信任的证书
    private    证书密钥存放目录
    openssl.cnf    openssl的CA主配置文件

openssl的配置文件为openssl.cnf,一般存储在/etc/pki/tls/目录下。一定要注意配置文件中 [ policy_match ]标签下设定的匹配规则。有可能因为证书使用的工具不一样,导致即使设置了csr中看起来有相同的countryName,stateOrProvinceName等,但在最终生成证书时依然报错。一般情况下,配置文件不需要改动。
生成根证书
1.生成根证书密钥

cd /etc/pki/CA/
openssl genrsa -out ./private/ca.key 2048

2.生成根证书请求
openssl req -new -in ./private/ca.key -out ca.csr
自签名证书和CA证书的区别和制作、使用第2张

3.生成根证书
openssl x509 -req -in ca.csr -signkey ./private/ca.key -extensions v3_ca -out ca.crt
自签名证书和CA证书的区别和制作、使用第3张

签发证书
我们可以用CA根证书签发证书,也可以创建中间CA,使用中间CA签发证书。创建中间CA的好处是即使中间CA的私钥泄露,造成的影响也是可控的,我们只需要使用root CA撤销对应中间CA的证书即可。此外root CA的私钥可以脱机妥善保存,只需要在撤销和更新中间CA证书时才会使用。基于根证书创建中间CA与创建根证书过程类似。我们新建一个目录用于保存中间证书信息
创建中间证书(可以不做)

#准备环境

mkdir /etc/pki/CA/intermediate
cd /etc/pki/CA/intermediate
mkdir certs crl newcerts private
chmod 700 private
touch index.txt
echo 1000 > serial

#生成密钥
cd /etc/pki/CA
openssl genrsa -aes256 -out intermediate/private/ca.key 2048
#新建请求
openssl req -config intermediate_CA.cnf -sha256 -new -key intermediate/private/ca.key -out intermediate/certs/ca.csr
#签发中间CA证书
openssl ca -config root_CA.cnf -extensions v3_ca -notext -md sha256 -in intermediate/certs/ca.csr -out intermediate/certs/ca.cert

利用根证书或者中间证书签发客户端证书的步骤如下:
mkdir -p /root/ca
1.新建证书密钥
openssl genrsa -out /root/ca/server.key 2048
2.新建证书请求
注意要和刚才ca证书申请的,信息一致
openssl req -new -in /root/ca/server.key -out /root/ca/server.csr
3.CA签发证书
openssl x509 -req -in /root/ca/server.csr -CA /etc/pki/CA/ca.crt -CAkey /etc/pki/CA/private/ca.key -CAcreateserial -out /root/ca/server.crt
4.证书有效性验证
openssl verify -CAfile /etc/pki/CA/ca.crt /root/ca/server.crt
5.不同客户端证书格式转换

#crt,pem格式证书可用于linux/nginx/node.js格式客户端
#p12(pkcs12)格式证书用于tomcat/java/android客户端
#打包为p12证书
openssl pkcs12 -export -in /root/ca/server.crt -inkey /root/ca/server.key -out /root/ca/server.p12

6.吊销证书

#获取要吊销的证书的serial
openssl x509 -in /root/ca/server.crt -noout -serial -subject

#对比serial与subject 信息是否与index.txt中的信息一致
#如果一致,则可以吊销证书
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

#如果是第一次吊销证书,需要指定吊销的证书编号
echo 01 >/etc/pki/CA/crlnumber

#更新吊销证书列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem

#完成后,可查看吊销的证书列表
openssl crl -in /etc/pki/CA/crl.pem -noout -text

三、使用

play

1、在项目里新建一个文件夹
2、将刚才签好客户端证书server.crt、server.key放到这里
3、打开配置文件conf/application.conf
4、添加以下三行

https.port=8000
certificate.key.file=      不要使用绝对路径
certificate.file= 

自签名证书和CA证书的区别和制作、使用第4张

5、重启项目 play restart

harbor

v3版的证书

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=testca.com
DNS.2=web
EOF

subj = /C=ch/ST=State or Province Name/L=beijing/O=jss/OU=jss/CN=yqpt2.com/emailAddress=testemail@qq.com 样例
1. mdkir -p /root/ca;cd /root/ca   放到一个目录里也可以,最后再把ca放到private里,方便管理
根CA
2. openssl genrsa -out ca.key 4096
3. openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mydomain.com" -key ca.key -out ca.crt
签发客户端证书
5. openssl genrsa -out mydomain.com.key 4096
6. openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=mydomain.com" -key mydomain.com.key -out mydomain.com.csr
7. openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in mydomain.com.csr -out mydomain.com.crt
验证证书
8. openssl verify -CAfile ca.crt mydomain.com.crt

参考文档1
参考文档2
参考文档3

免责声明:文章转载自《自签名证书和CA证书的区别和制作、使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DataFrame中文列名对齐的问题MapTalks.js 使用小结(三): 各类地图加载下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SSH无密码验证可能出现的问题

雪影工作室版权所有,转载请注明【http://blog.csdn.net/lina791211】 一、安装和启动SSH协议 假设没有安装ssh和rsync,可以通过下面命令进行安装。 sudo apt-get install ssh 安装SSH协议 sudo apt-get install rsync service sshd restart 启动服...

【转】Git详解之四 服务器上的Git

服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作。然而,如果想与他人合作,还需要一个远程的 Git 仓库。尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做,因为一不留心就很容易弄混其他人的进度。另外,你也一定希望合作者们即使在 自己不开机的时候也能从仓库获取数据 — 拥有一个更稳定的公共仓库十分有用。因此,更好...

RSA加密与解密

数据信息安全对我们每个人都有很重要的意义,特别是一些敏感信息,可能一些类似于收货地址、手机号还没引起大家的注意。但是最直白的,银行卡、姓名、手机号、身份证号,如果这些信息被黑客拦截到,他就可以伪装成你,把你的钱都取走。那我们该怎么防止这样的事情发生?报文加密解密,加签验签。 我害怕什么 我害怕卡里的钱被别人取走 我害怕转账的时候,报文被黑客拦截到,篡改信息...

openssl3.0 加密算法库编程精要 04 详解 EVP API 消息摘要

4.1 消息摘要的概念   消息摘要有好几个名字,比如单项散列函数,Hash 函数,它是一个将可变长度的输入串转换为一个固定长度的输出 串的函数。大多数消息摘要算法都是公开的,它的安全性依赖于它的单向性,如果仅获取到消息摘要的结果,想要从结果 反推出原文几乎是不可能的事情。并且对于输入串的细微改变,都会引发输出串的雪崩式变化,所以消息摘要一般用于校 验数据...

C#使用BouncyCastle来实现私钥加密公钥解密的方法与java互通的RSA加解密和签名(转)

因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密。在网上查了很久也没有很好的实现。BouncyCastle的文档少之又少。很多人可能会说,C#也是可以的,通过Biginteger开源类来实现,不过那个是有一个文章,不过他加密出来的是16进制结果的。根本不能和JAVA互通。连加密出来的都不和C#原生的加密出来的结果格式一样。所以还是没有...

PHP的openssl加密扩展使用小结

引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求)、数据完整性(没有被人修改过)、数据私密性(密文,无法直接读取)等。虽然现在已经有SSL/TLS协议实现的HTTPS协议,但是因在客户端上依赖浏览器的正确实现,而且效率又很低,所以一般的敏感数据(如交易支付信息等)还是需要我们使用加密方...