上海派拉基础产品部–张俊
环境准备
需要提供环境:
nginx服务器 |
centos7.5以上 |
用于部署gmssl/nginx |
windows笔记本一台 |
win7/win8/win10 |
用于验证单向/双向; 用于设置写入证书; |
360控制台账号 |
官网:360企业安全浏览器 注册申请:申请账号 管理后台: 登录后台 |
1、用户名/密码 2、如果用户名密码过期,可以重新申请账号,每个账号有三个月试用期。 |
360个人账号 |
用于登录360浏览器客户端 账号管理后台: 登录后台 |
1、测试账号用户名/密码: 2、客户端下载:登录后台后,在左下方点击“下载客户端”按钮。 3、账号添加:登录管理后台后,点击“用户管理”—->“添加用户”。 4、密码重置:登录管理后台后,点击“用户管理”,选择指定用户,点击”重置密码“即可在个人端登录。 |
测试演示环境 |
https://139.xxx.xxx.72/ |
演示环境目前为国密单向认证方式 |
一、Gmssl编译安装
- Gmssl作为openssl开源分支,其支持国密算法(sm2,sm3,sm4)以及国密证书生成的相关套件
目前编译版本基于Gmssl源码改造,以下为标准版本地址和公司实现版本。
- github地址: Gmssl源码地址
- gitlab地址:(已移除)
root用户登录linux主机,执行以下命令:
mkdir -p PATCH/20210312
cd PATCH/20210312
yum install git
yum groupinstall 'Development Tools' -y
#向相关开发获取GMssl源码
cd awesome-demo/GMDY/GMSSL/GmSSL-master
#预编译Gmssl,指定安装路径,指定路径可以自由指定。
./config --prefix=/usr/local/gmsslF8
#编译
make
#安装到/usr/local/gmsslF8
make install
#ld编译的时候选用gmssl本地库
export LD_LIBRARY_PATH=/usr/local/gmsslF8/lib/:$LD_LIBRARY_PATH
#查看gmssl版本信息
/usr/local/gmsslF8/bin/gmssl version
二、Nginx编译安装
- Nginx可以使用最新开源版本,需要指定gmssl的编译路径
Github: Nginx源码地址
root用户登录linux主机,执行以下命令:
cd ~/PATCH/20210312
#安装依赖包
yum install pcre pcre-devel -y
yum install zlib zlib-devel -y
#解压文件
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xvf nginx-1.18.0.tar.gz
cd nginx-1.18.0
#备份将要修改的文件
cp auto/lib/openssl/conf auto/lib/openssl/conf.bak
#编辑conf,将全部 $OPENSSL/.openssl/修改为$OPENSSL/
sed -i "s/$OPENSSL\/\.openssl\//$OPENSSL\//g" auto/lib/openssl/conf
#执行预处理auto/congfigure
注意如果更换gmssl目录,需要替换以下/usr/local/gmssl8
此外nginx的安装目录,尽量自定义/usr/local/nginxgmF8
cd ~/PATCH/20210312/nginx-1.18.0
./configure \
--prefix=/usr/local/nginxgmF8 \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-http_v2_module \
--with-openssl=/usr/local/gmsslF8 \
--with-stream
#执行安装
make
make install
/usr/local/nginxgmF8/sbin/nginx -v
三、国密证书生成
- 国密证书依赖Gmssl生成对应证书CA、server、client证书。
cd ~/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA
vim cert.sh
#批量修改/usr/local/gmsslF1为实际安装路径/usr/local/gmsslF8
sed -i "s/gmsslF1/gmsslF8/g" cert.sh
#修改CN=139.196.184.72为实际服务器IP或实际域名,如为1.1.1.1,则执行如下命令
sed -i "s/139.196.184.72/1.1.1.1/g" cert.sh
#添加执行权限
chmod 0755 cert.sh
#执行生成证书
./cert.sh
期间需要输入密码,可以跳过不输入。
cert.sh文件,根据需要修改:
export LD_LIBRARY_PATH=/usr/local/gmsslF8/lib/:$LD_LIBRARY_PATH
rm -rf *.pem
rm -rf *.pfx
# 生成CA证书
/usr/local/gmsslF8/bin/gmssl ecparam -genkey -name sm2p256v1 -text -out CA.key.pem
/usr/local/gmsslF8/bin/gmssl req -utf8 -new -key CA.key.pem -out CA.req.pem -subj "/C=CN/ST=ShangHai/L=ShangHai/O=上海派拉软件技术有限公司/CN=派拉国密CA服务器"
/usr/local/gmsslF8/bin/gmssl x509 -req -days 3650 -sm3 -in CA.req.pem -extfile openssl.cnf -extensions v3_ca -signkey CA.key.pem -out CA.crt.pem
#/usr/local/gmsslF8/bin/gmssl x509 -req -days 3650 -sm3 -in root.req -extfile openssl.cnf -extensions v3_ca -signkey root.key -out root.pem
rm -rf CA.pem
cat CA.crt.pem >>CA.pem
/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in CA.crt.pem -inkey CA.key.pem -out CA.p12 -name CA
# Server签名证书
/usr/local/gmsslF8/bin/gmssl ecparam -name sm2p256v1 -genkey -noout -out SS.key.pem
/usr/local/gmsslF8/bin/gmssl req -utf8 -new -SM3 -key SS.key.pem -out SS.csr.pem -subj "/C=CN/ST=ShangHai/L=ShangHai/O=上海派拉软件技术有限公司/CN=139.196.184.72"
/usr/local/gmsslF8/bin/gmssl x509 -req -SM3 -days 3650 -in SS.csr.pem -extfile openssl.cnf -extensions v3_req -CA CA.crt.pem -CAkey CA.key.pem -set_serial 1000000001 -out SS.crt.pem
rm -rf SS.pem
cat SS.crt.pem CA.crt.pem >> SS.pem
/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in SS.crt.pem -inkey SS.key.pem -out SS.p12 -name SS
# Server加密证书
/usr/local/gmsslF8/bin/gmssl ecparam -name sm2p256v1 -genkey -noout -out SE.key.pem
/usr/local/gmsslF8/bin/gmssl req -new -SM3 -key SE.key.pem -out SE.csr.pem -subj "/C=CN/ST=ShangHai/L=ShangHai/O=上海派拉软件技术有限公司/CN=139.196.184.72"
/usr/local/gmsslF8/bin/gmssl x509 -req -SM3 -days 3650 -in SE.csr.pem -extfile openssl.cnf -extensions v3enc_req -CA CA.crt.pem -CAkey CA.key.pem -set_serial 1000002001 -out SE.crt.pem
rm -rf SE.pem
cat SE.crt.pem CA.crt.pem >> SE.pem
/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in SE.crt.pem -inkey SE.key.pem -out SE.p12 -name SE
# 客户端签名证书
/usr/local/gmsslF8/bin/gmssl ecparam -genkey -name sm2p256v1 -noout -out CS.key.pem
/usr/local/gmsslF8/bin/gmssl req -utf8 -new -key CS.key.pem -out CS.req.pem -subj "/C=CN/ST=ShangHai/L=ShangHai/O=上海派拉软件技术有限公司/CN=139.196.184.72"
/usr/local/gmsslF8/bin/gmssl x509 -req -SM3 -days 3650 -in CS.req.pem -extfile openssl.cnf -extensions v3_req -CA CA.crt.pem -CAkey CA.key.pem -CAcreateserial -out CS.crt.pem
rm -rf CS.pem
cat CS.crt.pem CA.crt.pem >> CS.pem
/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in CS.crt.pem -inkey CS.key.pem -out CS.p12 -name CS
#/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in CS.pem -inkey client.key -out client.p12 -name https_client
# 客户端加密证书
/usr/local/gmsslF8/bin/gmssl ecparam -genkey -name sm2p256v1 -noout -out CE.key.pem
/usr/local/gmsslF8/bin/gmssl req -utf8 -new -key CE.key.pem -out CE.req.pem -subj "/C=CN/ST=ShangHai/L=ShangHai/O=上海派拉软件技术有限公司/CN=139.xxx.xxx.xxx"
/usr/local/gmsslF8/bin/gmssl x509 -req -SM3 -days 3650 -in CE.req.pem -CA CA.crt.pem -extfile openssl.cnf -extensions v3enc_req -CAkey CA.key.pem -CAcreateserial -out CE.crt.pem
#/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in client_en.pem -inkey client_en.key -out client_en.p12 -name https_client
rm -rf CE.pem client.pem server.pem
cat CE.crt.pem CA.crt.pem >> CE.pem
/usr/local/gmsslF8/bin/gmssl pkcs12 -export -in CE.crt.pem -inkey CE.key.pem -out CE.p12 -name CE
cat CS.crt.pem CE.crt.pem CA.crt.pem > client.pem
cat SS.crt.pem SE.crt.pem CA.crt.pem > server.pem
/usr/local/gmsslF8/bin/gmssl s_server -port 443 -key SS.key.pem -cert SS.crt.pem -dkey SE.key.pem -dcert SE.crt.pem -CAfile CA.crt.pem
/usr/local/gmsslF8/bin/gmssl s_client -connect localhost:443 -key CS.key.pem -cert CS.crt.pem -CAfile CA.crt.pem
openssl.cnf【cert.sh依赖文件】
cert.sh生成证书介绍:
CA签发中心 |
CA.key.pem |
CA密钥key |
|
CA.req.pem |
CA请求文件 |
||
CA.crt.pem |
CA签发证书crt格式 |
||
CA.pem |
CA签发证书pem格式 |
||
CA.p12 |
CA签发证书p12格式 |
||
SERVER服务端 |
签名证书 |
SS.key.pem |
服务器签名密钥key |
SS.csr.pem |
服务器签名请求文件 |
||
SS.crt.pem |
服务器签名证书crt格式 |
||
SS.pem |
服务器签名证书pem格式 |
||
SS.p12 |
服务器签名证书p12格式 |
||
加密证书 |
SE.key.pem |
服务器加密密钥key |
|
SE.csr.pem |
服务器加密请求文件 |
||
SE.crt.pem |
服务器加密证书crt格式 |
||
SE.pem |
服务器加密证书pem格式 |
||
SE.p12 |
服务器加密证书p12格式 |
||
CLIENT客户端 |
签名证书 |
CS.key.pem |
客户端签名密钥key |
CS.req.pem |
客户端签名请求文件 |
||
CS.crt.pem |
客户端签名证书crt格式 |
||
CS.pem |
客户端签名证书pem格式 |
||
CS.p12 |
客户端签名证书p12格式 |
||
加密证书 |
CE.key.pem |
客户端加密密钥key |
|
CE.req.pem |
客户端加密请求文件 |
||
CE.crt.pem |
客户端加密证书crt格式 |
||
CE.pem |
客户端加密证书pem格式 |
||
CE.p12 |
客户端加密证书p12格式 |
||
服务端证书链 |
server.pem |
服务端证书链(证书排序:签名在前,加密后,CA证书) |
|
客户端证书链 |
client.pem |
客户端证书链(证书排序:签名在前,加密后,CA证书最后) |
四、Nginx配置国密单向https配置
1、修改配置文件
cd /usr/local/nginxgmF8/
vi conf/nginx.conf
#将光标移至最后一个“}”上一行,并将下面内容拷贝至nginx.conf
以下为配置信息:证书采用第三章节生成
server
{
listen 0.0.0.0:443 ssl;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA:DES-CBC3-SHA:ECC-SM4-SM3:ECDHE-SM4-SM3:SM2-WITH-SMS4-SM3:ECDHE-SM2-WITH-SMS4-GCM-SM3;
ssl_prefer_server_ciphers on;
keepalive_timeout 70;
ssl_verify_client off;
ssl_client_certificate /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/client.pem;
ssl_certificate /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SS.crt.pem;
ssl_certificate_key /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SS.key.pem;
ssl_certificate /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SE.crt.pem;
ssl_certificate_key /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SE.key.pem;
location /
{
root html;
#add_header Guomissl 'type=2';
index index.html index.htm;
}
}
2、启动nginx
/usr/local/nginxgmF8/sbin/nginx -c /usr/local/nginxgmF8/conf/nginx.conf
成功结果截图:
其他相关命令:
停止nginx /usr/local/nginxgmF8/sbin/nginx -s stop
动态加载配置文件 /usr/local/nginxgmF8/sbin/nginx -s reload
日志路径:
/usr/local/nginxgmF8/logs
五、360企业版浏览器控制台配置
网站地址:360企业浏览器网站
注意:目前360企业网站开放注册,每个账号会有3个月的免费试用。如果现有账号失效,可以另行注册。
1、360控制台配置root证书
1.1.登录360企业安全浏览器
打开360企业安全浏览器,点击左上角灰色图标,登录360企业安全浏览器客户端,使用账号/密码登录
1.2.管理控制台配置根证书CA
- 网站配置根证书,用于360浏览器信任服务器证书。
登录地址:360企业安全浏览器管理控制台
账号:xxxx/xxxxx 注:账号三个月有效期,过可重新申请新的账号。申请账号
点击配置根证书:
根证书为第三章节生成的CA.pem文件。
将服务器/root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CA.pem文件下载到windows本地。
选择文件添加,添加CA.pem到页面:
点击确定,查看证书的详细情况:
访问浏览器查看效果:
如果浏览器显示:
可能是服务器防火墙未关导致,按照如下命令查看并关闭服务器防火墙:
1.查看防火墙是否打开:
systemctl status firewalld.service
显示下图表明防火墙已打开:
2.关闭防火墙:
systemctl stop firewalld.service
显示下图说明防火墙已关闭:
此时刷新360企业浏览器,可以正常显示。
2、 360控制台配置国密网关
- 不配置国密网关,360浏览器访问时将发送tls1.2,tls1.1交易
2.1 配置网关
添加应用
将网站网址填入应用设置页面
添加网关设置
设置网关:
3、360控制台下载windows/mac/linux客户端
3.1 下载客户端
点击”下载客户端“按钮
在下面页面选择对应的版本下载安装:
3.2 windows安装步骤
点击安装以下下载文件:
安装:
安装成功即可。打开登录账号:xxx/xxx
注:登录管理后台后,点击“用户管理”,选择指定用户,点击”重置密码“,记录密码,即可在个人端登录。
登录成功,即可访问网站。
六、360/密信浏览器双向认证环境整备
用于将密钥证书写入硬件key,硬件key用户国密网站访问
1、双向认证必备
- 硬件key:目前龙脉科技的GM3000已调通。
- 硬件驱动:需要对应厂商的硬件驱动。
- 国密浏览器:360企业版/密信浏览器
- windows个人计算机:用于安装国密浏览器,其他操作系统待调研。
2、证书获取
证书采用第三章节生成的证书:
CS.p12 –客户端国密签名证书
CE.p12 –客户端国密加密证书
将服务器证书下载到windows个人电脑。
3、windows个人电脑安装硬件驱动
点击文件安装
4、证书写入硬件key
解压文件夹,将硬件key插入电脑,点击运行mTokenGMAdmin.exe
出现以下界面:
4.1 应用的增/删
- key中利用应用管理不同类型的证书。eg:rsa\smx
右键GM3000,创建应用,需要先认证设备。
认证设备(其中认证密钥为默认填写):
通过后,既可创建应用:
4.2 管理应用的密钥证书
点击应用:
如果需要对应用进行操作,需要登录应用
登录应用,输入对应密码【此处密码为浏览器调用硬件key时输入的PIN,如有修改,请牢记】:
登录成功后,即可创建容器
4.3 容器中证书的导入(以国密证书为例)
国密签名证书导入CS.p12
国密加密证书导入CE.p12
最终配置结果:
5、配置windows个人计算机
导入注册表项:
按win+R,输入regedit,查看以下键值是否正确:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Cryptography\Defaults\Provider\LongMai
注册表快照对比:
七、360浏览器单向验证
此处浏览器版本,参考第四章3.1小节下载指定客户端。
输入测试账号:
用户名/密码:xxxx/xxxxx
弹出非私密连接,点击继续访问【如360控制台已设置CA,此页面将不会跳出】:
访问网站,网址前会提示访问方式:
八、密信浏览器单向验证
windows版本:
访问
点击高级/选择继续前往
显示正常页面:
查看证书:
确认证书算法
九、Nginx国密双向https配置【客户端认证采用硬件key】
1、修改配置文件
cd /usr/local/nginxgmF8/
vi conf/nginx.conf
#将"ssl_verify_client off;" 改为"ssl_verify_client on;"
以下为nginx-server模块配置信息:证书采用第三章节生成的相关证书
2、启动nginx
/usr/local/nginxgmF8/sbin/nginx -c /usr/local/nginxgmF8/conf/nginx.conf
其他相关命令:
停止nginx /usr/local/nginxgmF8/sbin/nginx -s stop
动态加载配置文件 /usr/local/nginxgmF8/sbin/nginx -s reload
3、360浏览器双向认证
此处浏览器版本安装,参考第四章3.1小节下载指定客户端。
360浏览器登录:
输入测试账号:
用户名/密码:xxxx/xxxx
弹出非私密连接,点击继续访问:
输入硬件key的密码,点击确定【此处密码为第五章节4.2设置的密码,默认12345678】:
进入网站:
4、密信浏览器双向验证
windows版本安装:
弹出选择证书,确认证书后,点击确定。
输入硬件key的密码,点击确定【此处密码为第五章节4.2设置的密码,默认12345678】
显示正常页面:
查看证书:
确认证书算法
八、Nginx支持RSA/国密双模式
- 目前国密浏览器支持有限,为了使用户能够使用主流浏览器访问,可以设置RSA证书,方便Google、IE,firefox等浏览器的正常访问。
九、遇到问题总结
1、Gmssl命令调试出错,gmtls未支持国密签名Z值计算,目前不推荐使用命令行验证单向/双向
- 开一个服务终端,服务器启动命令:
export LD_LIBRARY_PATH=/usr/local/gmsslF8/lib/:$LD_LIBRARY_PATH
/usr/local/gmsslF8/bin/gmssl s_server -accept 4430 \
-key /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SS.key.pem \
-cert /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SS.crt.pem \
-dkey /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SE.key.pem \
-dcert /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/SE.crt.pem \
-CAfile /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CA.crt.pem -Verify 1 \
-msg -debug -gmtls
- 新开一个客户终端,访问命令:
export LD_LIBRARY_PATH=/usr/local/gmsslF8/lib/:$LD_LIBRARY_PATH
/usr/local/gmsslF8/bin/gmssl s_client -connect 127.0.0.1:4430 \
-key /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CS.key.pem \
-cert /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CS.crt.pem \
-dkey /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CE.key.pem \
-dcert /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CE.crt.pem \
-CAfile /root/PATCH/20210312/awesome-demo/GMDY/GMSSL/CA/CA.crt.pem \
-msg -debug -gmtls
- 服务端认证报错:
解决:
后期代码修复客户端工具
2、浏览器认证的时候,使用其他浏览器访问国密网站
- 使用google浏览器访问:
解决:
更换360国密浏览器/密信浏览器。或者nginx网关配置RSA证书。
3、客户端国密证书写入浏览器无法生效
解决:
目前国密浏览器双向认证过程,客户端无法识别软证书。需要硬件key.
4、360国密浏览器访问不是私密连接,进入后国密标签为灰色
- 网站不是私密连接问题
- 国密标签为灰色
解决: 如果网站为内网环境,则无法取消。如果为外网环境,可以参考第四章1.1节配置根证书。
5、360国密浏览器协商异常日志
tail -f /usr/local/nginxgmF8/logs/error.log
360打开国密网站,虽然会访问成功,但是先期会先发送TLS1.x交易,nginx这边会有相应日志。
解决:如果为外网环境,可以参考第四章2.1节配置国密网关。
修改好后可查看访问日志:
tail -f /usr/local/nginxgmF8/logs/error.log
来源:freebuf.com 2021-04-30 10:16:05 by: hua1998
请登录后发表评论
注册