C++,python,热爱算法和机器学习
全部博文(1214)
分类: 网络与安全
2017-10-26 15:53:42
http://blog.itpub.net/21851324/viewspace-1023022/
http://www.cnblogs.com/thbCode/p/5829719.html
1,公钥私钥成对出现
2,私钥只有我知道
3,大家可以用我的公钥给我发加密的信了
4,大家用我的公钥解密信的内容,看看能不能解开,能解开,说明是经过我的私钥加密了,就可以确认确实是我发的了。
总结一下结论:
1,用公钥加密数据,用私钥来解密数据
2,用私钥加密数据(数字签名),用公钥来验证数字签名。
在实际的使用中,公钥不会单独出现,总是以数字证书的方式出现,这样是为了公钥的安全性和有效性。
公钥和私钥一般都是用PEM方式保存,但是公钥文件还不足以成为证书,还需要CA的签名证书
OpenSSL建立自己的CA
(1) 环境准备
首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。
这里我们选择目录 /var/MyCA。
然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。
除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。
$ mkdir /var/MyCA
$ cd /var/MyCA
$ mkdir certs private
$ chmod g-rwx,o-rwx private
$ echo "01" > serial
$ touch index.txt
第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:
$ touch openssl.cnf
文件内容如下:
[ ca ]
default_ca = myca
[ myca ]
dir = /var/MyCA
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial
default_crl_days= 7
default_days = 365
default_md = md5
policy = myca_policy
x509_extensions = certificate_extensions
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints= CA:false
[ req ]
default_bits = 2048
default_keyfile = /var/MyCA/private/cakey.pem
default_md = md5
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = My Test CA
stateOrProvinceName = HZ
countryName = CN
emailAddress = test@cert.com
organizationName = Root Certification Authority
[ root_ca_extensions ]
basicConstraints = CA:true
(2) 生成根证书 (Root Certificate)
我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。
$ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356 -config openssl.cnf
验证一下我们生成的文件。
$ openssl x509 -in cacert.pem -text -noout
生成结果:
private/cakey.pem 是CA证书的私钥文件,
cacert.pem 是CA证书。
制作用于CA签名的CA的私钥和公钥文件
[root@localhostssl.crt]#openssl genrsa -des3 -out ca.key 1024
//要求为key文件输入密码(ca.key.password,随便输入,可以和输入的PEM密码不同)
[root@localhostssl.crt]#openssl req -new -x509 -days 18250-key ca.key -out ca.crt
//要求输入密码以及证书信息。输入的密码要与使用的key文件的密码一致,否则会出错。
同时需要输入证书信息。以完成公钥生成。
2、制作服务器证书
a、生成服务器私钥(server.key)
[root@localhost ssl.crt]#openssl genrsa -des3 -out server.key 1024
输入加密密码(server.key.password),用128位rsa算法密钥server.key文件
该密码在部署客户端密钥时需要使用。
b、生成服务器证书请求(server.csr)
[root@localhost ssl.crt]#openssl req -new -key server.key -out server.csr
这里要求输入的CommonName必须与通过浏览器访问您网站的 URL 完全相同,否则用户会发现您服务器证书的通用名与站点的名字不匹配,用户就会怀疑您的证书的真实性。可以使域名也可以使IP地址。
c、生成服务器公钥(证书)
[root@localhost ssl.crt]#openssl ca -in server.csr -days 18250 -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
d、查看和验证证书信息
[root@localhost ssl.crt]#openssl x509 -noout -text -in server.crt //查看证书信息
[root@localhost ssl.crt]#openssl verify -CAfile ca.crt server.crt //验证证书信息
一定要保证验证通过,没有报错或警告信息。否则可能会在使用时出错。
3、制作客户端证书
a、生成客户端私钥(client.key)
[root@localhost ssl.crt]#openssl genrsa -des3 -out client.key 1024
输入加密密码(client.key.password),用128位rsa算法密钥client.key文件
该密码在部署客户端密钥时需要使用。
b、生成客户端证书请求(client.csr)
[root@localhost conf]#openssl req -new -key client.key -out client.csr
Common Name 可以随便取。
c、生成客户端公钥(证书)
[root@localhost ssl.crt]#openssl ca -in client.csr -days 18250 -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
将证书转换成浏览器可识别的格式:
[root@conf]#openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
需要输入Export密码,可以和Key文件密码不一样。该密码在客户端部署KEY文件时需要使用。
d、
[root@localhost ssl.crt]#openssl x509 -noout -text -in client.crt //查看证书信息
[root@localhost ssl.crt]#openssl verify -CAfile ca.crt client.crt //验证证书信息
一定要保证验证通过,没有报错或警告信息。否则可能会在使用时出错。