对于双向认证提问的整理

作者 Weixu 日期 2018-08-22
对于双向认证提问的整理

标签(空格分隔): 双向认证


1、NG和Tomcat搭建过程是怎样的?

以下是Nginx的配置过程

首先将我们生成的服务端证书以及信任的客户端证书放置到某一目录下

然后再 Nginx 的配置文件中,配置如下代码即可

ssl on;
ssl_certificate server.crt; //服务器证书
ssl_certificate_key server.key; //服务器私钥
ssl_client_certificate client.crt; //客户端证书
ssl_verify_client on; //开启客户端验证

以下是Tomcat下的配置过程
配置到Tomcat下需要keystore文件,以下为从 crt 文件 以及 key 文件转化为 keystore 的指令

第一步,从key和crt生成pkcs12格式的keystore

openssl pkcs12 -export -in test.crt -inkey test.key -out test.p12 -name tomcat -CAfile server.crt -caname root -chain

第二步 生成tomcat需要的keystore

keytool -importkeystore -v -srckeystore test.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore test.keystore -deststoretype jks -deststorepass 123456


第三步 生成受信任的客户端证书

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore client.p12


第四步 让服务器信任客户端证书

keytool -export -alias mykey -keystore client.p12 -storetype PKCS12 -storepass 123456 -rfc -file client.cer #将客户端证书导出为一个单独的CER文件

第五步 将CER文件导入到服务器的证书库
keytool -import -v -file client.cer -keystore test.keystore

第六步 检查安装结果
keytool -list -keystore test.keystore

再配置如下即可完成双向验证

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="ssh/test.keystore" keystorePass="123456"
truststoreFile="ssh/test.keystore" truststorePass="123456"/>

PS:将 clientAuth 设置为 true 为开启客户端验证

2、Https的这些过程是怎么进行的?协议实现上每个阶段的主要信息有哪些?

由于添加不了图片,故详细见PPT

3、非对称加密;对称加密;摘要算法,分别用在上面的什么阶段?
非对称加密 : 建立连接的阶段
对称加密 : 连接建立完成后的数据通信阶段
摘要算法 :
主要用户根证书签出子证书时候,其详细流程如下

假设 A 证书要对 B 证书进行签名

先用摘要算法计算 B 的全部信息的摘要
用 A 的私钥对该 摘要信息 进行加密
最后将加密的信息写入到 B 的签名区域作为B的签名信息

以下是认证的过程,即用 A 证书来认证 B 证书

首先取出 B 证书的 签名区域的信息
用 A 的公钥对该信息进行解密
然后将解密后的信息于 B 的全部信息的摘要信息进行比较

若结果一致,则认证通过

4、公钥和私钥怎么用?加密和签名过程有什么区别?公钥和私钥生成关系?
(1).公钥和私钥主要用于非对称加密,用公钥加密的数据只能用私钥解密,反之亦然
(2).
公钥加密私钥解密是 数据加密
私钥加密公钥解密是 数据签名(如上A对B进行签名)
(3)私钥生出公钥,而公钥不能生成私钥
OpenSSL 使用 PEM 文件格式存储证书和密钥,以下为转换的代码

genrsa -out rsa_private_key.pem 1024
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

5、证书;签发;CA;怎么签发自有证书?需要提供哪些信息?证书里面的级别是怎么回事?能不能从CA的证书再签发子证书?签发证书的时候可以选择密码是怎么回事?怎么防止证书被非法使用?如果证书泄露怎么补救?

(1)怎么签发自有证书?需要提供哪些信息?
先生成私钥,然后生成证书请求文件,最后自签出证书,openssl指令如下

生成根证书文件
openssl genrsa -des3 -out root.key

创立根证书的申请文件root.csr:
openssl req -new -key root.key -out root.csr

创建根证书
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey root.key -in root.csr -out root.crt

生成自己的私钥
openssl genrsa -des3 -out test.key 1024

生成证书请求文件
req -new -key myprivate.key -out test.csr

签出证书
openssl x509 -req -in test.csr -out test.crt -signkey test.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

(2)证书里面的级别是怎么回事?
目前SSL证书的等级主要有三级,验证级别依次递增
域名验证型SSL证书(DV) -> 机构验证型SSL证书(OV)[https://www.zzidc.com/main/huodong/eightactive] -> 扩展验证型SSL证书(EV) (https://www.chinassl.net/ov_ssl/)

(3)能不能从CA的证书再签发子证书?
可以,使用openssl指令如下

生成自己的私钥
openssl genrsa -des3 -out myprivate.key 1024

生成证书请求文件
req -new -key myprivate.key -out myprivate.csr

签出证书
openssl x509 -req -in myprivate.csr -out myprivate.crt -signkey myprivate.key -CA server.crt -CAkey server.key -CAcreateserial -days 990

(4)签发证书的时候可以选择密码是怎么回事?

(5)怎么防止证书被非法使用?如果证书泄露怎么补救?
证书被非法的情况为,再建立连接的时候,入侵者将自己的公钥以及窃取的证书发送回浏览器,以窃取浏览器的私钥,从而与浏览器进行通信

防止证书被非法使用 => 保护好证书以及私钥
如果发现证书泄露 => 应立即更换服务器证书

什么是证书文件;证书请求文件;?

证书文件 : 证明服务器身份
证书请求文件 : 向正规CA机构或者自签证书时候提供的包含申请者详细信息的文件

7、SNI是什么
如果一个服务器有多个域名,如 https://ldt.yealink.com https://ldt.yealinkops.com
在连接到服务器建立SSL链接之前先发送要访问站点的域名
这样服务器根据这个域名返回一个合适的证书

8、部署双向认证的时候有哪些坑?为什么需要特殊版本的NG?
(1) 连接不能带有端口,否则浏览器验证不通过
(2) tomcat配置信任证书是将要信任的证书导入到服务器证书

公司的话机需要特殊版本的NG原因为 MD5证书签名问题

centos7下面的openssl不支持md5 => 通过环境变量打开centos7下的openssl对md5的支持

做出如下修改即可

	1. 操作系统:vi /etc/profile
export NSS_HASH_ALG_SUPPORT=+MD5
export OPENSSL_ENABLE_MD5_VERIFY=1
2. Service: Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
3. NG原代码:src/os/unix/ngx_process_cycle.c
ngx_worker_process_cycle, ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");

- char* p = getenv("OPENSSL_ENABLE_MD5_VERIFY");
if (!p)
{
- ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "! Can't get OPENSSL_ENABLE_MD5_VERIFY");

- setenv("OPENSSL_ENABLE_MD5_VERIFY", "1", 1);
- p = getenv("OPENSSL_ENABLE_MD5_VERIFY");
- }
- if (!p)
- {
- ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "@ Can't get OPENSSL_ENABLE_MD5_VERIFY");
- setenv("OPENSSL_ENABLE_MD5_VERIFY", "1", 1);
- }
- else
- {
- ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "@ Get OPENSSL_ENABLE_MD5_VERIFY: %s", p);
- }