技术分享:如何让网站启用HPKP(公钥钉扎)

时间:2016-12-1 作者:光网烈火编辑部 分类: 技术

2016年12月,光网烈火成功启用了HPKP(公钥钉扎),英文全称:HTTP Public Key Pinning。下面就有请计算机安全运维专家烈火君,给大家分享一下有关于HPKP(公钥钉扎)的安全知识和实际部署操作。

HPKP(公钥钉扎)的作用是让浏览器只信任网站所设置固定的CA(证书颁发结构)公钥,而不是浏览器中所存储的任何一家CA都可以为之签发。以防止证书伪造的目的。

技术分享:如何让网站启用HPKP

HPKP(公钥钉扎)实战部署

1.利用openssl生成证书公钥的pin-sha256指纹数据

openssl x509 -in ssl.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

命令释义:ssl.pem为证书公钥,此方法也适用于文件后缀名的cer证书公钥。

2.利用openssl生成一个新的证书备份请求文件(backup.csr)

openssl req -new -newkey rsa:4096 -nodes -sha256 \
-keyout private.key -out backup.csr

3.通过以上命令生成出来的backup.csr请求文件,用相同的方法,使用openssl再生成backup.csr请求文件的pin-sha256指纹数据,如果已经有ssl.csr证书请求文件,则可以跳过第二步。

openssl x509 -in backup.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

4.部署所生成的pin-sha256指纹数据到wen释义引擎的配置文件中。

Apache

LoadModule headers_module modules/mod_headers.so
Header set Public-Key-Pins "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=2592000; includeSubDomains"

Lighttpd

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Public-Key-Pins" => "pin-sha256=\"base64+primary==\"; pin-sha256=\"base64+backup==\"; max-age=2592000; includeSubDomains")
}

Nginx

add_header Public-Key-Pins 'pin-sha256="base64+primary=="; pin-sha256="base64+backup=="; max-age=2592000; includeSubDomains';

命令释义:配置文件中需要把base64+primary==替换成站点的证书公钥pin-sha256指纹数据,base64+backup==则为backup.csr请求文件的pin-sha256指纹数据(可以用相同方法生成多个证书公钥的指纹哈希,以防CA吊销证书引起的站点故障问题。)

最后,使用qualys ssl labs检测网站,结果包含绿条提示"HTTP Public Key Pinning (HPKP) deployed on this server. Yay!"如下图即可。

技术分享:如何让网站启用HPKP

网友看法

avatra
心海e站
2017-07-19 19:12
老大可以帮忙配置一下吗,弄了一天都没有把网站启用HPKP

发表看法