WAF https证书制作方法
2019-10-15
一. WAF代理HTTPS站点原理介绍
WAF代理后交互介绍
由于WAF本身采用的就是反向代理架构,所以不论是串联、旁路还是反向代理,其中的交互过程都是一样的。
代理过程分以下三步:
1. 客户端访问WAF,首先完成三次握手:
其中45.64.168.122是WAF的WAN口地址,192.168.16.63是客户端地址。
2. WAF充当服务器,建立第一段连接,开始进行ssl握手:
这个过程中,客户端hello发完后,WAF会响应一个server的hello包,后面紧跟着WAF相应站点证书的公钥:
即这里上传的cer证书(其中包括公钥,私钥和CA证书):
然后客户端根据此证书的公钥进行加密后传输数据:
3. 和真实客户端ssl握手建立成功后,WAF用上传证书中的私钥解密真实客户端发来的数据,开始向真实服务器发送握手请求建立第二段连接,此时WAF充当客户端,真实服务器发给WAF的证书是真实服务器上储存的公钥:
然后WAF用服务器发来的公钥将数据加密后发给服务器。
如此一来,两段ssl握手完成,开始数据交互。
上传至WAF的HTTPS证书作用介绍
实际上上传到waf的证书有两个作用,一是发送公钥给客户端让客户端加密,二是用来解密客户端发来的真实数据。而与真实服务器的交互过程实际用的是真实服务器发来的公钥。
此外,浏览器会校验证书链的完整性,以及颁发机构(CA)是否在可信列表中,因此,上传到WAF的HTTPS证书中除服务器公私钥外,应当添加有CA机构颁发的中间证书及根证书。
二. 服务器公私钥提取方法
很多客户的网站维护人员不会操作服务器将证书提取出来,还有一些客户是不会同意我们在服务器上直接将公私钥拷贝出来的,他们只会提供给我们一些加密过的JKS/PFX证书,其中包含公私钥,我们需要从中提取,下面具体介绍公私钥的提取方法。
从Linux/Nginx服务器直接提取公钥
如果服务器中间件的ssl配置文件中没有保存服务器的公私钥,那么可以借用服务器自带的openssl工具来导出公钥:
1. #openssl req -new -key server110.com.key -out server110.com.csr //制作CSR证书申请文件,按步骤填写相关信息:
2. 给申请证书自签名:
openssl x509 -req -days 3650 -in server110.com.csr -signkey server110.com.key -out server110.com.crt
-days 3650 证书的有效期,自己给自己颁发证书,想有多久有效期,就弄多久,我一下弄了10年的有效期;
-in server110.com.csr 指定CSR文件
-signkey server110.com.key 指定服务器的私钥key文件
-out server110.com.crt 设置生成好的证书文件名
3. server110.com.crt就是我们所要的公钥:
二.2 从Linux/Nginx服务器直接提取私钥
#mkdir /etc/cert //建立证书和key的保存目录,路径自己决定;
#cd /etc/cert
#openssl genrsa -out server110.com.key 1024 //生成1024位加密的服务器私钥server110.com.key
然后去除私钥的密码:
# openssl rsa -in server.key -out server.key
从Windows服务器提取公私钥(PFX)
从IIS中间键中导出PFX文件
当然windows系统也可以在cmd命令行下参照2.1和2.2的命令使用openssl来导出公私钥。
对于IIS服务器,可从UI导出PFX文件从而提取公私钥:
这里以II6为例,IIS7操作也类似,从UI导出即可。
1.在运行中输入“mmc”出现“控制台窗口
2. 在控制台的主菜单选择“添加/管理单元”:
3. 点击“添加”后往下拉滚动条,找到“证书”,选中后继续点“添加”
4. 选择“计算机账户”后点击下一步:
5. 按下图配置,点击“完成”:
6.然后可以看到新添加的管理单位--证书:
7. 选择证书--个人--证书,就可以看到所有的站点了,然后右键选择需要导出证书的站点,选择“所有任务”--“导出”即可将证书导出
8. 导出私钥:
9. 如果允许直接导出base64编码的证书,则直接选择base64编码导出,如果不行,则导出为PKCS12加密的PFX证书
10. 为导出的证书键入密码(强制):
11. 键入文件名:
12. 导出成功:
注意:导出的PFX中包含有加密的私钥和一个自签名的公钥,如果站点有CA证书,则需使用带有CA签名的公钥。
从PFX文件中提取公私钥
好了,当客户提供给我们这个PFX文件后,如何将公私钥从中提取出来呢?请参照以下步骤:
首先,你得准备好安装有openssl的环境。假设PFX文件名为cqdx.pfx
1. openssl pkcs12 -in cqdx.pfx -nodes -out server.pem
2. 以RSA加密方式输出私钥:openssl rsa -in server.pem -out server.key
以x509解码方式输出公钥:openssl x509 -in server.pem -out server.crt
这样,公钥的crt文件和私钥的key文件就得到了,然后按步骤合成WAF可用的cer证书即可。
从JKS文件提取公私钥
一般来说,有安全意识的服务器运维人员不会直接将脱密的公私钥文件交付给咱们,为保证公私钥传递过程的安全性,一般会选用keystore(javascript自带工具)将公私钥加密后导出为JKS文件再进行交付。那我们拿到JKS文件后如何将公私钥从中提取出来呢?请参照以下步骤执行:
1、从JKS转换到PKCS12
D:\ssl>keytool -importkeystore -srckeystore keystore_old.jks -destkeystore keystore_old.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass changeit -deststorepass changeit -srcalias tom_server -destalias xxx -srckeypass changeit -destkeypass changeit -noprompt
英语小白指南:这里srcstorepass后面跟的是导出jks时设置的密码;destpass是导出为.p12文件后的密码;srcalias是用keystore导出jks时设置的别名,destalias是输出为.p12后的别名;srckeypass是jks中私钥加密的密码,destkeypass则是导出的p12文件中用来加密私钥的密码
2、从PKCS12转换成PEM格式
openssl pkcs12 -in keystore_old.p12 -out server.pem -passin pass:12345678 -passout pass:12345678
英语小白指南:
-srcstorepass 654321/-srckeypass 654321 是客户提供的密码
-deststorepass 123456/-destkeypass 123456 是新生成的密码(也要一致,不一致会报错)
3、以RSA加密方式输出私钥:openssl rsa -in server.pem -out server.key
以x509解码方式输出公钥:openssl x509 -in server.pem -out server.crt
这样,公钥的crt文件和私钥的key文件就得到了,然后按步骤合成WAF可用的cer证书即可。
从浏览器中直接导出公钥
首先访问目标站点,点击浏览器上的锁图标:
然后点击查看证书:
在详细信息选项卡中点击导出:
格式选择pem或者crt即可:
至此,服务器公钥GET
如何从抓包中获取公钥和CA证书
1. 首先,抓到一次完整的HTTPS交互报文,并找到Certificate项(如果包含多级证书,一次会话中会包含多个Certificate)
2. 扩展此项,找到certificate握手内容记录(如经CA认证,应该有多个):
3. 右键先选择第一个Certificate,选择“导出分组字节流”:
4. 另存为一个原始编码的bin文件:
5. 将此文件后缀修改为der:
6. 双击打开即可查看证书信息:
按照此方法依次导出Certificate选项中的所有certificate记录,即可获得公钥和CA证书。
以从上至下的顺序,这些证书分别是:
1. 公钥
2. CA二级证书(如果有的话)
3. CA根证书
三. WAF HTTPS站点证书格式说明
所需材料:
1. 服务器私钥server.key;
2. 签名过的公钥xxx.cer或xxx.crt或xxx.pem;
3. CA证书(包括中级证书,根证书)
注意,这里摆放顺序很有讲究,公钥须在文件最顶端,然后是CA证书(中级证书,根证书),最后是私钥。
Linux可用cat合成,windows则推荐用notepad++合成。
一个完整的HTTPS站点证书示例:
证书链不完整可能会导致部分浏览器(尤其是安卓系统自带的浏览器)校验不通过导致无法访问对应的网站。