双方都用同一个密钥加密,并用该密钥进行解密。
【缺点】:密钥传输给对方时可能会被第三方截获,加密就失去了意义。
每个私钥对应一个公钥;A方要给B方传信息,只要拿到B方的公钥进行加密,B方用自己的私钥进行解密。在这个过程中,就算数据被截获,没有私钥的第三方也解密不了数据。
【缺点】:RSA加密耗时长
为了解决RSA速度慢的特点(比对称加密慢百倍),将对称加密的密钥通过非对称加密进行传输,拿到密钥之后就用对称加密进行通讯
【漏洞】:如果第三方伪装为中间人,拦截A和B的信息传输;那他可以偷偷更换双方发出的公钥,通过自己的私钥解密双方的信息,所有的信息将暴漏给了第三方。
为了确保数据传输过程中没有第三方中间人,需要有一个认证中心来证明传输方的身份。认证中心发布证书,证书有公钥 + 个人基本信息。
然后用Hash算法将公钥 + 个人基本信息生成信息摘要,再对信息摘要进行非对称加密(签名)。
签名将和公钥 + 个人基本信息一起作为数字签名,传输给了B方。
B方用认证中心给的公钥将信息摘要解密,然后再将公钥 + 个人基本信息进行Hash运算,得出的信息摘要进行对比。对比通过,则说明公钥就是个人基本信息里的人传出来的。
拿到正确的公钥,就可以通过 对称加密 + RSA非对称加密 的方式进行通讯。
【漏洞】:在公钥传给CA过程中,如果第三方伪装为CA,所有的信息将会被拦截修改。还好浏览器/系统内置了顶级的CA证书,保证传输给CA过程不会被拦截。
配置 HTTPS 要用到私钥 example.key 文件和 example.crt 证书文件。
而认证中心生成证书文件需要 example.csr 文件。
CSR(Cerificate Signing Request)文件包含申请者标识名,公钥信息
用OpenSSL生成CSR文件:
openssl req -new -newkey rsa:2048 -sha256 -nodes -out kxjs_com.csr -keyout kxjs_com.key -subj "/C=CN/ST=GuangZhou/L=GuangZhou/O=Kxjs Inc./OU=Web Security/CN=kxjs.hp.gov.cn"
参数说明:
- C:Country ,单位所在国家,为两位数的国家缩写,如: CN 就是中国
- ST 字段: State/Province ,单位所在州或省
- L 字段: Locality ,单位所在城市 / 或县区
- O 字段: Organization ,此网站的单位名称
- OU 字段: Organization Unit,下属部门名称;也常常用于显示其他证书相关信息,如证书类型,证书产品名称或身份验证类型或验证内容等
- CN 字段: Common Name ,网站的域名
将key和csr文件放到nginx服务器指定目录下
listen 443 ssl;
server_name kxjs.hp.gov.cn;
charset utf-8;
ssl on;
ssl_certificate /usr/unify/nginx/ssl/server.crt;
ssl_certificate_key /usr/unify/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;