WAF代理HTTPS站点原理
由于WAF本身采用的说就是反向代理架构,所以无论是串联,旁路还是反向代理,其中的交互方式都是一样的。
代理过程分为以下三步:
客户端访问WAF,首先完成三次握手:
其中45.64.168.122是WAF的WAN口地址,192.168.16.63是客户端的地址
WAF充当服务器,建立第一段连接,开始进行ssl握手:
在这个过程钟,客户端hello发完后,WAF会响应一个server的hello包,后面紧跟着WAF的相关证书的公钥:
这里上传的cer证书,其中包括公钥,私钥,和ca证书
然后客户端根据此证书的公钥进行加密后传输数据:
和真实客户端SSL握手建立成功后,WAF用上传的证书中私钥解密真实的客户端发来的数据后,开始向真实服务器发送握手亲求后建立第二阶段连接,此时WAF充当客户端,真实服务器发给WAF的证书是真实服务器上存储的公钥:
然后WAF用服务器发来的公钥将数据加密后发给服务器,如此一来,两段式SSL握手完成,开始数据交互。
上传到WAF的HTTPS证书作用:
实际上传到WAF的证书有两个作用,一是发送公钥给客户端让客户端加密,二来使用来解密客户端发来的真实数据,从而与真实的服务器的交互过程实际上用的是真实服务器发来的公钥。
此外,浏览器会校验证书链的完整性,以及颁发机构CA是否存在在可信列表中,因此,上传到WAF的HTTPS证书中除了服务器公钥外,应当添加有CA机构办法的中间证书以及根证书。
服务器公私钥提取办法
很多客户的网站维护人员不会操作服务器将证书提取出来,还有一些管理员不同意在服务器上直接将公私钥拷贝出来的,他们只会提供一些加密国的JKS/PFS证书,其中包括公私钥,需要从中提取,以下是提取办法:
从Linux/Nginx服务器直接提取公钥
如果服务器中间件SSL配置文件中没有保存服务器的公私钥,那么可以借用服务器自导的openssl工具来导出公钥:
openssl req -new -key server110.com.key -out server110.com.csr #制作CSR证书申请文件
给申请证书自签名:
openssl x509 -req -days 3650 -in server110.com.csr -signkey server110.com.key -out server110.com.crt
- days 3650 证书有效期
- in server110.com.csr 指定csr文件
- signkey server110.com.key 指定服务器的私钥key文件
- out server110.com.crt 指定生成好的证书文件名
server110.com.crt就是我们需要的公钥
从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)
从ISS中间件导出PFX
windows系统可以在cmd中使用openssl来导出公钥和私钥,命令根从linux上一样
对于IIS服务器,可以从UI中导出PFX文件从而达到提取公私钥的目的。
一IIS6,7为例子
- 运行中输入MMC,打开控制台
- 选择“添加/管理单元”
- 点击添加后,找到证书,选中后继续点击“添加”
- 选择计算器中户后下一步
- 按照下图配置,点击完成
- 然后可以看到添加管理单位-证书
- 选择证书-个人-证书,就可以看到所有的站点了,然后右键选择需要导出证书的站点,选择“所有任务”--“导出” 即可将证书导出
- 导出私钥
- 如果允许直接导出base64编码的证书,则直接选择base64编码导出,如果不行,则导出为PKCS12家吗的PFX的证书
- 为导出证书键入密码(强制)
- 键入文件名
- 导出成功
注意,导出的PFX中包含有加密和一个自签名的公钥,如果站点有CA证书,则需要使用滴油CA签名的公钥。
从PFX文件中提取公私钥
首先需要使用openssl环境。假设PFX文件名cqdx.pfx
openssl pkcs12 0in cqdx.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key #以rsa加密方式输出私钥
opensll x509 -in server.pem -out server.crt #以x509解码的方式输出公钥
这样,公钥的crt文件和私钥的key文件就得到了,然后按照步骤和合成WAF的cert证书即可
用JKS文件提取公私钥
一般来说,有安全意识的运维人员不会直接将脱密的公私钥文件交给别人,为了保证私钥的传递过程的安全性,一般会选用keystore(javascript自带工具)将公钥加密后导出为JKS文件再进行交付。
- 从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文件中用来加密私钥的密码
- 从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 是新生成的密码(也要一致,不一致会报错)
openssl rsa -in server.pem -out server.key #以RSA加密方式输出私钥
openssl x509 -in server.pem -out server.crt #以x509编码方式输出公钥
这样,公钥的crt和私钥的key文件就得到了,然后按照步骤合成WAF证书。
从浏览器直接导出公钥
首先访问目标网站,点击浏览器锁图标
然后点击查看证书
在详细信息选项卡中点击导出
格式选择pem或者crt即可
至此,服务器公钥GET
从抓包中获取公钥和CA证书
- 抓取一次完整的HTTPS交互报文,并找到Certificate项(如果包含多级证书,一次会话包含多个Certificate)
- 扩展此项,找到certificate握手内容记录(如果经过CA认证,应该有多个)
- 右键选择第一个Certificate,选择”导出分组字节流“
- 另存为一个原始编码的bin文件
- 将此文件后缀修改为der
- 双击打开即可查看证书信息
按照此方法依次导出Certificate选项中的所有certificate记录,即可获得公钥和CA证书。
以从上到下的顺序,这些证书分别是:
- 公钥
- CA二级证书(如果有的话)
- CA根证书
WAF HTTPS站点证书格式说明
所需材料
- 服务器私钥key
- 签名过的公钥xxx.cer或者xxx.crt或者xxx.pem
- CA证书(包括中级证书,根证书)
注意,证书摆放顺序由讲究,顺序为 公钥->CA证书(中级证书,根证书)->私钥
linux可以用cat合成,windows则推荐使用notepad++合成
证书链的不完整可能会导致部分浏览器(尤其是安卓系统自带的浏览器)校验不通过导致无法访问对应的网站。