首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料、博客,一点点摸索总结出来的,问了很多前辈和博主,但是可能都没有看到都没有回复我 = = 。但项目必须得做身不由己,无奈只能自己试一试了。

如果有哪里不对的地方,请各位一定指出,也让我学习一下,感谢!

博客参考的资料地址会将参考的内容会在文中给出,我总结的步骤有不清楚的地方可以参考原文。

相信看到这篇博客的同学对于openssl的认识应该都比我要深,我就不班门弄斧了。可能国密这个领域对于其他技术来说还是太小众了,可以参考的教程太少,而且个人实现的国密算法基本上都没有经过严格测试,问题的解决也不是很迅速。本文的目的是记录我在国密https尝试过程中遇到的坑以及解决方法,或许对刚入坑的新手有所帮助,不会像我一样毫无头绪。

废话少说我们就开始吧

一、双证书生成

关于国密双证书的问题,参考啥?双证书?这篇博客的内容:

国密标准对于SSL通信定义得不是很清楚,所能依仗的标准只有《GMT 0024-2014 SSL VPN 技术规范》。在文档中提到,国密TLS需要有签名证书和加密证书。

不管是出于安全的考虑还是其他怎么样,国密的标准是这样要求的, 所以我们在自己搭建国密证书的时候还是考虑到这一点比较好。

我看了很多博客,大家都是按照TASSL的 Tassl_demo/mk_tls_cert 目录下的SM2certgen.sh这个脚本进行生成的,但是我在Windows环境下使用的时候出现了一点问题,但是没办法还是得用,大致弄清楚了步骤,按照我的实际需求修改了一下:


# For a list of supported curves, use "apps/openssl ecparam -list_curves".# Path to the openssl distribution
OPENSSL_DIR=.
# Path to the openssl program
OPENSSL_CMD=gmssl
# Option to find configuration file
OPENSSL_CNF="-config ./openssl.cnf"
# Directory where certificates are stored
CERTS_DIR=./sm2Certs
# Directory where private key files are stored
KEYS_DIR=$CERTS_DIR
# Directory where combo files (containing a certificate and corresponding
# private key together) are stored
COMBO_DIR=$CERTS_DIR
# cat command
CAT="C:/Progra~1/Git/usr/bin/cat.exe"
# rm command
RM="C:/Progra~1/Git/usr/bin/rm.exe"
# mkdir command
MKDIR="C:/Progra~1/Git/usr/bin/mkdir.exe"
# The certificate will expire these many days after the issue date.
DAYS=1500
TEST_CA_CURVE=SM2
TEST_CA_FILE=CA
TEST_CA_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)"TEST_SERVER_CURVE=SM2
TEST_SERVER_FILE=SS
TEST_SERVER_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)"TEST_SERVER_ENC_FILE=SE
TEST_SERVER_ENC_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server enc (SM2)"TEST_CLIENT_CURVE=SM2
TEST_CLIENT_FILE=CS
TEST_CLIENT_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=client sign (SM2)"TEST_CLIENT_ENC_FILE=CE
TEST_CLIENT_ENC_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=client sign (SM2)"# Generating an EC certificate involves the following main steps
# 1. Generating curve parameters (if needed)
# 2. Generating a certificate request
# 3. Signing the certificate request
# 4. [Optional] One can combine the cert and private key into a single
#    file and also delete the certificate request$MKDIR -p $CERTS_DIR
$MKDIR -p $KEYS_DIR
$MKDIR -p $COMBO_DIRecho "Generating self-signed CA certificate (on curve $TEST_CA_CURVE)"
echo "==============================================================="
$OPENSSL_CMD ecparam -name $TEST_CA_CURVE -out $TEST_CA_CURVE.pem# Generate a new certificate request in $TEST_CA_FILE.req.pem. A
# new ecdsa (actually ECC) key pair is generated on the parameters in
# $TEST_CA_CURVE.pem and the private key is saved in $TEST_CA_FILE.key.pem
# WARNING: By using the -nodes option, we force the private key to be
# stored in the clear (rather than encrypted with a password).
$OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CA_DN" \-keyout $KEYS_DIR/$TEST_CA_FILE.key.pem \-newkey ec:$TEST_CA_CURVE.pem -new \-out $CERTS_DIR/$TEST_CA_FILE.req.pem# Sign the certificate request in $TEST_CA_FILE.req.pem using the
# private key in $TEST_CA_FILE.key.pem and include the CA extension.
# Make the certificate valid for 1500 days from the time of signing.
# The certificate is written into $TEST_CA_FILE.cert.pem
$OPENSSL_CMD x509 -req -days $DAYS \-in $CERTS_DIR/$TEST_CA_FILE.req.pem \-extfile $OPENSSL_DIR/openssl.cnf \-extensions v3_ca \-signkey $KEYS_DIR/$TEST_CA_FILE.key.pem \-out $CERTS_DIR/$TEST_CA_FILE.cert.pem# Display the certificate
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CA_FILE.cert.pem -text# Place the certificate and key in a common file
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CA_FILE.cert.pem -issuer -subject \> $COMBO_DIR/$TEST_CA_FILE.pem
$CAT $KEYS_DIR/$TEST_CA_FILE.key.pem >> $COMBO_DIR/$TEST_CA_FILE.pem# Remove the cert request file (no longer needed)
$RM $CERTS_DIR/$TEST_CA_FILE.req.pemecho "GENERATING A TEST SERVER CERTIFICATE (on elliptic curve $TEST_SERVER_CURVE)"
echo "=========================================================================="
# Generate a new certificate request in $TEST_SERVER_FILE.req.pem. A
# new ecdsa (actually ECC) key pair is generated on the parameters in
# $TEST_SERVER_CURVE.pem and the private key is saved in
# $TEST_SERVER_FILE.key.pem
# WARNING: By using the -nodes option, we force the private key to be
# stored in the clear (rather than encrypted with a password).
$OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_SERVER_DN" \-keyout $KEYS_DIR/$TEST_SERVER_FILE.key.pem \-newkey ec:$TEST_SERVER_CURVE.pem -new \-out $CERTS_DIR/$TEST_SERVER_FILE.req.pem# Sign the certificate request in $TEST_SERVER_FILE.req.pem using the
# CA certificate in $TEST_CA_FILE.cert.pem and the CA private key in
# $TEST_CA_FILE.key.pem. Since we do not have an existing serial number
# file for this CA, create one. Make the certificate valid for $DAYS days
# from the time of signing. The certificate is written into
# $TEST_SERVER_FILE.cert.pem
$OPENSSL_CMD x509 -req -days $DAYS \-in $CERTS_DIR/$TEST_SERVER_FILE.req.pem \-CA $CERTS_DIR/$TEST_CA_FILE.cert.pem \-CAkey $KEYS_DIR/$TEST_CA_FILE.key.pem \-extfile $OPENSSL_DIR/openssl.cnf \-extensions v3_req \-out $CERTS_DIR/$TEST_SERVER_FILE.cert.pem -CAcreateserial# Display the certificate
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_SERVER_FILE.cert.pem -text# Place the certificate and key in a common file
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_SERVER_FILE.cert.pem -issuer -subject \> $COMBO_DIR/$TEST_SERVER_FILE.pem
$CAT $KEYS_DIR/$TEST_SERVER_FILE.key.pem >> $COMBO_DIR/$TEST_SERVER_FILE.pem# Remove the cert request file (no longer needed)
$RM $CERTS_DIR/$TEST_SERVER_FILE.req.pemecho " GENERATING A TEST SERVER ENCRYPT CERTIFICATE (on elliptic curve $TEST_SERVER_CURVE)"
echo "  ==================================================================================="
# Generate a new certificate request in $TEST_SERVER_FILE.req.pem. A
# new ecdsa (actually ECC) key pair is generated on the parameters in
# $TEST_SERVER_CURVE.pem and the private key is saved in
# $TEST_SERVER_FILE.key.pem
# WARNING: By using the -nodes option, we force the private key to be
# stored in the clear (rather than encrypted with a password).
$OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_SERVER_ENC_DN" \-keyout $KEYS_DIR/$TEST_SERVER_ENC_FILE.key.pem \-newkey ec:$TEST_SERVER_CURVE.pem -new \-out $CERTS_DIR/$TEST_SERVER_ENC_FILE.req.pem# Sign the certificate request in $TEST_SERVER_FILE.req.pem using the
# CA certificate in $TEST_CA_FILE.cert.pem and the CA private key in
# $TEST_CA_FILE.key.pem. Since we do not have an existing serial number
# file for this CA, create one. Make the certificate valid for $DAYS days
# from the time of signing. The certificate is written into
# $TEST_SERVER_FILE.cert.pem
$OPENSSL_CMD x509 -req -days $DAYS \-in $CERTS_DIR/$TEST_SERVER_ENC_FILE.req.pem \-CA $CERTS_DIR/$TEST_CA_FILE.cert.pem \-CAkey $KEYS_DIR/$TEST_CA_FILE.key.pem \-extfile $OPENSSL_DIR/openssl.cnf \-extensions v3enc_req \-out $CERTS_DIR/$TEST_SERVER_ENC_FILE.cert.pem -CAcreateserial# Display the certificate
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_SERVER_ENC_FILE.cert.pem -text# Place the certificate and key in a common file
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_SERVER_ENC_FILE.cert.pem -issuer -subject \> $COMBO_DIR/$TEST_SERVER_ENC_FILE.pem
$CAT $KEYS_DIR/$TEST_SERVER_ENC_FILE.key.pem >> $COMBO_DIR/$TEST_SERVER_ENC_FILE.pem# Remove the cert request file (no longer needed)
$RM $CERTS_DIR/$TEST_SERVER_ENC_FILE.req.pemecho "GENERATING A TEST CLIENT CERTIFICATE (on elliptic curve $TEST_CLIENT_CURVE)"
echo "=========================================================================="
# Generate a new certificate request in $TEST_CLIENT_FILE.req.pem. A
# new ecdsa (actually ECC) key pair is generated on the parameters in
# $TEST_CLIENT_CURVE.pem and the private key is saved in
# $TEST_CLIENT_FILE.key.pem
# WARNING: By using the -nodes option, we force the private key to be
# stored in the clear (rather than encrypted with a password).
$OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CLIENT_DN" \-keyout $KEYS_DIR/$TEST_CLIENT_FILE.key.pem \-newkey ec:$TEST_CLIENT_CURVE.pem -new \-out $CERTS_DIR/$TEST_CLIENT_FILE.req.pem# Sign the certificate request in $TEST_CLIENT_FILE.req.pem using the
# CA certificate in $TEST_CA_FILE.cert.pem and the CA private key in
# $TEST_CA_FILE.key.pem. Since we do not have an existing serial number
# file for this CA, create one. Make the certificate valid for $DAYS days
# from the time of signing. The certificate is written into
# $TEST_CLIENT_FILE.cert.pem
$OPENSSL_CMD x509 -req -days $DAYS \-in $CERTS_DIR/$TEST_CLIENT_FILE.req.pem \-CA $CERTS_DIR/$TEST_CA_FILE.cert.pem \-CAkey $KEYS_DIR/$TEST_CA_FILE.key.pem \-extfile $OPENSSL_DIR/openssl.cnf \-extensions v3_req \-out $CERTS_DIR/$TEST_CLIENT_FILE.cert.pem -CAcreateserial# Display the certificate
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CLIENT_FILE.cert.pem -text# Place the certificate and key in a common file
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CLIENT_FILE.cert.pem -issuer -subject \> $COMBO_DIR/$TEST_CLIENT_FILE.pem
$CAT $KEYS_DIR/$TEST_CLIENT_FILE.key.pem >> $COMBO_DIR/$TEST_CLIENT_FILE.pem# Remove the cert request file (no longer needed)
$RM $CERTS_DIR/$TEST_CLIENT_FILE.req.pemecho " GENERATING A TEST CLIENT ENCRYPT CERTIFICATE (on elliptic curve $TEST_CLIENT_CURVE)"
echo " ==================================================================================="
# Generate a new certificate request in $TEST_CLIENT_FILE.req.pem. A
# new ecdsa (actually ECC) key pair is generated on the parameters in
# $TEST_CLIENT_CURVE.pem and the private key is saved in
# $TEST_CLIENT_FILE.key.pem
# WARNING: By using the -nodes option, we force the private key to be
# stored in the clear (rather than encrypted with a password).
$OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CLIENT_ENC_DN" \-keyout $KEYS_DIR/$TEST_CLIENT_ENC_FILE.key.pem \-newkey ec:$TEST_CLIENT_CURVE.pem -new \-out $CERTS_DIR/$TEST_CLIENT_ENC_FILE.req.pem# Sign the certificate request in $TEST_CLIENT_FILE.req.pem using the
# CA certificate in $TEST_CA_FILE.cert.pem and the CA private key in
# $TEST_CA_FILE.key.pem. Since we do not have an existing serial number
# file for this CA, create one. Make the certificate valid for $DAYS days
# from the time of signing. The certificate is written into
# $TEST_CLIENT_FILE.cert.pem
$OPENSSL_CMD x509 -req -days $DAYS \-in $CERTS_DIR/$TEST_CLIENT_ENC_FILE.req.pem \-CA $CERTS_DIR/$TEST_CA_FILE.cert.pem \-CAkey $KEYS_DIR/$TEST_CA_FILE.key.pem \-extfile $OPENSSL_DIR/openssl.cnf \-extensions v3enc_req \-out $CERTS_DIR/$TEST_CLIENT_ENC_FILE.cert.pem -CAcreateserial# Display the certificate
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CLIENT_ENC_FILE.cert.pem -text# Place the certificate and key in a common file
$OPENSSL_CMD x509 -in $CERTS_DIR/$TEST_CLIENT_ENC_FILE.cert.pem -issuer -subject \> $COMBO_DIR/$TEST_CLIENT_ENC_FILE.pem
$CAT $KEYS_DIR/$TEST_CLIENT_ENC_FILE.key.pem >> $COMBO_DIR/$TEST_CLIENT_ENC_FILE.pem# Remove the cert request file (no longer needed)
$RM $CERTS_DIR/$TEST_CLIENT_ENC_FILE.req.pem

这里需要注意的一点是

TEST_CA_DN="//skip=yes/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)"

这里原本是:

TEST_CA_DN="/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)"

但是放在这个命令执行会报错:

OPENSSL_CMD req $OPENSSL_CNF -nodes -subj "$TEST_CA_DN" 

参考在 MinGW 中使用 OpenSSL 创建证书时的 BUG这个博客的方法进行修改即可。

按照上述文件就可以生成相应的密钥和证书文件:

证书生成在其下的sm2Certs子目录里,其中:

  • CA.key.pem和CA.cert.pem分别是CA私钥和CA证书。

  • CE.cert.pem和CE.key.pem分别是客户端的加密证书和对应的私钥。

  • CS.cert.pem和CS.key.pem分别是客户端的签名证书和对应的私钥。

  • SE.cert.pem和SE.key.pem分别是服务器的加密证书和对应的私钥。

  • SS.cert.pem和SS.key.pem分别是服务器的签名证书和对应的私钥。

二、双证书运行服务

如何使用openssl的s_server命令运行双证书我也查了很久,没有博客明确说明,我也不知道这样是不是对的。

我查看了官方的接口说明,openssl s_server的参数中的-cert和-key我们都很熟悉,CA之类的更不可能会弄混,但是还有个参数-dcert和-dkey并不是很明白这个用法。

官方的解释如下:

-dcert filename-dkey keyname

specify an additional certificate and private key, these behave in the same manner as the -cert and -key options except there is no default if they are not specified (no additional certificate and key is used). As noted above some cipher suites require a certificate containing a key of a certain type. Some cipher suites need a certificate carrying an RSA key and some a DSS (DSA) key. By using RSA and DSS certificates and keys a server can support clients which only support RSA or DSS cipher suites by using an appropriate certificate.

我想双证书应该是在这里添加的吧

但是尝试了:

gmssl s_server -accept 44330 -key .\SE.key.pem -cert .\SE.cert.pem -dkey .\SS.key.pem -dcert .\SS.cert.pem  -CAfile .\CA.cert.pem

报错了:

gmssl s_server -accept 44330 -key .\SE.key.pem -cert .\SE.cert.pem -dkey .\SS.key.pem -dcert .\SS.cert.pem  -CAfile .\CA.cert.pemUsing default temp DH parameters
[GMTLS_DEBUG] set sm2 encryption certificate
[GMTLS_DEBUG] set sm2 decryption private key
[GMTLS_DEBUG] set sm2 signing certificate
error setting private key
2419748:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:crypto\x509\x509_cmp.c:288:

这时候看到GmSSL编程实现gmtls协议C/S通信(BIO版本)这个博客的一句话:

在设置双证书时,需要先设置签名证书,然后再设置加密证书,具体可参考源码。

源码我是没有时间去啃了,但是这里给了我提示,我把命令改成:

gmssl s_server -accept 44330 -key .\SS.key.pem -cert .\SS.cert.pem  -dkey .\SE.key.pem -dcert .\SE.cert.pem -CAfile .\CA.cert.pem

哈哈果然可以,得到结果:

gmssl s_server -accept 44330 -key .\SS.key.pem -cert .\SS.cert.pem  -dkey .\SE.key.pem -dcert .\SE.cert.pem -CAfile .\CA.cert.pemUsing default temp DH parameters
[GMTLS_DEBUG] set sm2 signing certificate
[GMTLS_DEBUG] set sm2 signing private key
[GMTLS_DEBUG] set sm2 encryption certificate
[GMTLS_DEBUG] set sm2 decryption private key
ACCEPT

如果我没有猜错的话,应该是成功了,接下来就是使用s_client进行测试了:

gmssl s_client -connect localhost:44330 -key .\CS.key.pem -cert .\CS.cert.pem -CAfile .\CA.cert.pem

得到结果:

gmssl s_client -connect localhost:44330 -key .\CS.key.pem -cert .\CS.cert.pem -CAfile .\CA.cert.pem[GMTLS_DEBUG] set sm2 signing certificate
[GMTLS_DEBUG] set sm2 signing private key
CONNECTED(00000230)
depth=1 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = SORB of TASS, CN = Test CA (SM2)
verify return:1
depth=0 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = BSRC of TASS, CN = server sign (SM2)
verify return:1
---
Certificate chain0 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)1 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICGjCCAcGgAwIBAgIJAIVjx+dwZIdkMAoGCCqBHM9VAYN1MIGCMQswCQYDVQQG
EwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcMB0hhaURpYW4xJTAjBgNVBAoMHEJl
aWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4xFTATBgNVBAsMDFNPUkIgb2YgVEFT
UzEWMBQGA1UEAwwNVGVzdCBDQSAoU00yKTAeFw0yMDA2MjAxMDE4MjVaFw0yNDA3
MjkxMDE4MjVaMIGGMQswCQYDVQQGEwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcM
B0hhaURpYW4xJTAjBgNVBAoMHEJlaWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4x
FTATBgNVBAsMDEJTUkMgb2YgVEFTUzEaMBgGA1UEAwwRc2VydmVyIHNpZ24gKFNN
MikwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAS0lHzt7CkOzCtyf6VwCqoT2PYD
CL/AJrCsHa+6lE8wDZ7DShI2bvfmrpavndEW67CHQOlO0q6/aoEB0PoAgpopoxow
GDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIGwDAKBggqgRzPVQGDdQNHADBEAiB06JWp
uxFbGBfvG9juhe2Umu/auI1H2XeMdvDjbOtfuQIgMXT8jewkzq9TR3OPzRTkZCRH
3H+xKEb8r8JsEEStwaU=
-----END CERTIFICATE-----
subject=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)
issuer=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
No client certificate CA names sent
Peer signing digest: SM3
Server Temp Key: ECDH, SM2, 256 bits
---
SSL handshake has read 1625 bytes and written 322 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-SM2-WITH-SMS4-GCM-SM3
Server public key is 256 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:Protocol  : TLSv1.2Cipher    : ECDHE-SM2-WITH-SMS4-GCM-SM3Session-ID: 07C747B77FFA3A856AD6344443AC9232A546EE8610A465538E4973DC53B5C00DSession-ID-ctx:Master-Key: FB16D89B2711388BFA315B6AAD2449A18DCE9F21AEBC51515A8B6ABDA27BFD67E0DB2BFA3DC8CCA311F828F14D4BC57CPSK identity: NonePSK identity hint: NoneSRP username: NoneTLS session ticket lifetime hint: 7200 (seconds)TLS session ticket:0000 - 19 41 b1 2a f1 40 bf d7-1d 83 92 a1 86 bb 44 a5   .A.*.@........D.0010 - cf 4a 04 65 e9 37 56 57-26 d6 0d bd fd c2 da c9   .J.e.7VW&.......0020 - 8c fb 13 75 62 2b a1 fd-47 7c 19 ce 72 96 2f 8b   ...ub+..G|..r./.0030 - ca 11 d6 1f ef fc b0 2b-ff 3b d9 d4 dd fd 83 5b   .......+.;.....[0040 - 48 bb 8d 3e 90 57 91 7b-fd ae 3d 42 7d fb f6 8b   H..>.W.{..=B}...0050 - 33 3f b8 5c a2 ef 2a 53-e1 a9 6d 06 b3 00 e4 37   3?.\..*S..m....70060 - 63 d8 90 64 ae 31 9b e8-41 d5 d7 55 93 14 37 4d   c..d.1..A..U..7M0070 - 1b cc 49 bd 6e ff fc 67-f0 52 f9 19 7d 8d f8 93   ..I.n..g.R..}...0080 - 19 39 80 91 57 91 e8 28-e3 f9 32 ce 86 06 41 94   .9..W..(..2...A.0090 - aa 94 54 ce 5b f8 32 e1-36 e6 08 f7 0c 54 fc 49   ..T.[.2.6....T.IStart Time: 1592931339Timeout   : 7200 (sec)Verify return code: 0 (ok)Extended master secret: yes
---
hello
I
read:errno=0
PS D:\测绘院项目\usrTest\sm2Certs> gmssl s_client -connect localhost:44330 -key .\CS.key.pem -c
ert .\CS.cert.pem -CAfile .\CA.cert.pem
[GMTLS_DEBUG] set sm2 signing certificate
[GMTLS_DEBUG] set sm2 signing private key
CONNECTED(00000234)
2415044:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:ssl\record\rec_layer_s3.c:1385:SSL alert number 40
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 196 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:Protocol  : TLSv1.2Cipher    : 0000Session-ID:Session-ID-ctx:Master-Key:PSK identity: NonePSK identity hint: NoneSRP username: NoneStart Time: 1592969606Timeout   : 7200 (sec)Verify return code: 0 (ok)Extended master secret: no
---
PS D:\测绘院项目\usrTest\sm2Certs> gmssl s_client -connect localhost:44330 -key .\CS.key.pem -c
ert .\CS.cert.pem -CAfile .\CA.cert.pem
[GMTLS_DEBUG] set sm2 signing certificate
[GMTLS_DEBUG] set sm2 signing private key
CONNECTED(0000022C)
depth=1 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = SORB of TASS, CN = Test CA (SM2)
verify return:1
depth=0 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = BSRC of TASS, CN = server sign (SM2)
verify return:1
---
Certificate chain0 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)1 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICGjCCAcGgAwIBAgIJAIVjx+dwZIdkMAoGCCqBHM9VAYN1MIGCMQswCQYDVQQG
EwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcMB0hhaURpYW4xJTAjBgNVBAoMHEJl
aWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4xFTATBgNVBAsMDFNPUkIgb2YgVEFT
UzEWMBQGA1UEAwwNVGVzdCBDQSAoU00yKTAeFw0yMDA2MjAxMDE4MjVaFw0yNDA3
MjkxMDE4MjVaMIGGMQswCQYDVQQGEwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcM
B0hhaURpYW4xJTAjBgNVBAoMHEJlaWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4x
FTATBgNVBAsMDEJTUkMgb2YgVEFTUzEaMBgGA1UEAwwRc2VydmVyIHNpZ24gKFNN
MikwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAS0lHzt7CkOzCtyf6VwCqoT2PYD
CL/AJrCsHa+6lE8wDZ7DShI2bvfmrpavndEW67CHQOlO0q6/aoEB0PoAgpopoxow
GDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIGwDAKBggqgRzPVQGDdQNHADBEAiB06JWp
uxFbGBfvG9juhe2Umu/auI1H2XeMdvDjbOtfuQIgMXT8jewkzq9TR3OPzRTkZCRH
3H+xKEb8r8JsEEStwaU=
-----END CERTIFICATE-----
subject=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)
issuer=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
No client certificate CA names sent
Peer signing digest: SM3
Server Temp Key: ECDH, SM2, 256 bits
---
SSL handshake has read 1623 bytes and written 322 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-SM2-WITH-SMS4-GCM-SM3
Server public key is 256 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:Protocol  : TLSv1.2Cipher    : ECDHE-SM2-WITH-SMS4-GCM-SM3Session-ID: 1DCC6B0179ADDBB29C5EFF24DD602676AC8B1BBE5FC435507822C9A53D1C47BASession-ID-ctx:Master-Key: 539960E1EFA21DE2849C345C8993FDCD52BF8708048E560D7CA98998797DB2EBDE4B84892378B356294808C029FBD15FPSK identity: NonePSK identity hint: NoneSRP username: NoneTLS session ticket lifetime hint: 7200 (seconds)TLS session ticket:0000 - 51 0b cf 65 b8 52 33 d2-93 a6 88 92 86 97 bc d4   Q..e.R3.........0010 - cb 26 c6 90 73 8c 99 74-6c e3 65 c8 d0 02 03 cb   .&..s..tl.e.....0020 - 91 ed 0f c5 45 90 14 00-b7 8a 16 23 6b c4 0c 2a   ....E......#k..*0030 - bf 14 55 aa 28 5e f6 ac-5e 93 7d 82 27 96 29 63   ..U.(^..^.}.'.)c0040 - 4a 8f 10 19 66 76 b4 f4-51 5a 3d 05 0c 3c 6d 19   J...fv..QZ=..<m.0050 - 87 01 87 c2 84 79 d2 ec-c0 21 2f 86 18 8b 26 57   .....y...!/...&W0060 - 34 14 4d e9 98 f5 8b 58-a4 f8 99 57 60 a9 d7 4a   4.M....X...W`..J0070 - 9a e6 ab 35 ea 62 4f 60-a9 c8 11 e3 84 0b ab 21   ...5.bO`.......!0080 - 98 fb 1c c3 df 11 e6 82-c8 88 f4 5e ce bb ed 65   ...........^...e0090 - f8 fc e2 76 9e b3 f2 c1-23 ad d5 16 80 c2 c4 ec   ...v....#.......Start Time: 1592969623Timeout   : 7200 (sec)Verify return code: 0 (ok)Extended master secret: yes
---
PS D:\测绘院项目\usrTest\sm2Certs> gmssl s_server -accept 44330 -key .\SE.key.pem -cert .\SE.ce
rt.pem -dkey .\SS.key.pem -dcert .\SS.cert.pem  -CAfile .\CA.cert.pem
Using default temp DH parameters
[GMTLS_DEBUG] set sm2 encryption certificate
[GMTLS_DEBUG] set sm2 decryption private key
[GMTLS_DEBUG] set sm2 signing certificate
error setting private key
2419748:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:crypto\x509\x509_cmp.c:288:
PS D:\测绘院项目\usrTest\sm2Certs> gmssl s_server -accept 44330 -key .\SE.key.pem -cert .\SE.ce
rt.pem -dkey .\SS.key.pem -dcert .\SS.cert.pem  -CAfile .\CA.cert.pem
Using default temp DH parameters
[GMTLS_DEBUG] set sm2 encryption certificate
[GMTLS_DEBUG] set sm2 decryption private key
[GMTLS_DEBUG] set sm2 signing certificate
error setting private key
2421476:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:crypto\x509\x509_cmp.c:288:
PS D:\测绘院项目\usrTest\sm2Certs> gmssl s_client -connect localhost:44330 -key .\CS.key.pem -c
ert .\CS.cert.pem -CAfile .\CA.cert.pem
[GMTLS_DEBUG] set sm2 signing certificate
[GMTLS_DEBUG] set sm2 signing private key
CONNECTED(00000244)
depth=1 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = SORB of TASS, CN = Test CA (SM2)
verify return:1
depth=0 C = CN, ST = BJ, L = HaiDian, O = Beijing JNTA Technology LTD., OU = BSRC of TASS, CN = server sign (SM2)
verify return:1
---
Certificate chain0 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)1 s:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)i:/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICGjCCAcGgAwIBAgIJAIVjx+dwZIdkMAoGCCqBHM9VAYN1MIGCMQswCQYDVQQG
EwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcMB0hhaURpYW4xJTAjBgNVBAoMHEJl
aWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4xFTATBgNVBAsMDFNPUkIgb2YgVEFT
UzEWMBQGA1UEAwwNVGVzdCBDQSAoU00yKTAeFw0yMDA2MjAxMDE4MjVaFw0yNDA3
MjkxMDE4MjVaMIGGMQswCQYDVQQGEwJDTjELMAkGA1UECAwCQkoxEDAOBgNVBAcM
B0hhaURpYW4xJTAjBgNVBAoMHEJlaWppbmcgSk5UQSBUZWNobm9sb2d5IExURC4x
FTATBgNVBAsMDEJTUkMgb2YgVEFTUzEaMBgGA1UEAwwRc2VydmVyIHNpZ24gKFNN
MikwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAS0lHzt7CkOzCtyf6VwCqoT2PYD
CL/AJrCsHa+6lE8wDZ7DShI2bvfmrpavndEW67CHQOlO0q6/aoEB0PoAgpopoxow
GDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIGwDAKBggqgRzPVQGDdQNHADBEAiB06JWp
uxFbGBfvG9juhe2Umu/auI1H2XeMdvDjbOtfuQIgMXT8jewkzq9TR3OPzRTkZCRH
3H+xKEb8r8JsEEStwaU=
-----END CERTIFICATE-----
subject=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=BSRC of TASS/CN=server sign (SM2)
issuer=/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)
---
No client certificate CA names sent
Peer signing digest: SM3
Server Temp Key: ECDH, SM2, 256 bits
---
SSL handshake has read 1623 bytes and written 322 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-SM2-WITH-SMS4-GCM-SM3
Server public key is 256 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:Protocol  : TLSv1.2Cipher    : ECDHE-SM2-WITH-SMS4-GCM-SM3Session-ID: 7156DC0D61E4CC134B10BE09808615279ADA2F5B58FD6F86692262340D51279CSession-ID-ctx:Master-Key: 2BAC73469D6274F2D4E87F11EAA049D7338839163FDCF329906F2A5208863059C577550106BECE65A721FEDD0B8E2E4EPSK identity: NonePSK identity hint: NoneSRP username: NoneTLS session ticket lifetime hint: 7200 (seconds)TLS session ticket:0000 - aa 1c 89 11 bd b7 f2 10-b0 2c 0f e6 5f e5 a6 eb   .........,.._...0010 - 96 1d 6b 4d 47 0d a3 28-f7 8d 92 02 66 9d 9a c6   ..kMG..(....f...0020 - a5 c8 e0 4a a0 f0 18 7d-40 c8 72 0d ff 9b 8a 4b   ...J...}@.r....K0030 - f0 fe 16 d2 da 48 21 98-7f 25 88 14 f2 6e 9b 11   .....H!..%...n..0040 - 53 59 35 3d d9 16 fa a6-74 79 81 fc d8 09 c2 7b   SY5=....ty.....{0050 - 6e a7 5a 21 ca d8 51 e0-15 e1 2f 18 d9 23 e1 98   n.Z!..Q.../..#..0060 - 3f dd fd d7 99 1f c4 3d-83 2c f2 1b e0 ff a6 8a   ?......=.,......0070 - 35 9f ab 9a b5 f7 ef 95-27 d5 d4 c7 42 21 29 37   5.......'...B!)70080 - 34 3c b9 87 83 94 56 03-ab 42 1e a3 55 be 81 19   4<....V..B..U...0090 - 94 58 41 5b bf 73 fe 06-0e e9 01 53 87 b3 b5 97   .XA[.s.....S....Start Time: 1592970114Timeout   : 7200 (sec)Verify return code: 0 (ok)Extended master secret: yes
---

(会不会内容太长了,我不太懂csdn这个富文本有没有代码折叠的功能,如果有的话请告知,我会修改的。)

这个时候的s_server端接收到消息:

-----BEGIN SSL SESSION PARAMETERS-----
MFoCAQECAgMDBALhBwQABDArrHNGnWJ08tTofxHqoEnXM4g5Fj/c8ymQbypSCIYw
WcV3VQEGvs5lpyH+3QuOLk6hBgIEXvLLgqIEAgIcIKQGBAQBAAAArQMCAQE=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-SM2-WITH-SMS4-GCM-SM3:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-SM2-WITH-SMS4-SM3:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA
Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1:SM2+SM3
Shared Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1:SM2+SM3
Supported Elliptic Curve Point Formats: uncompressed:ansiX962_compressed_prime:ansiX962_compressed_char2
Supported Elliptic Curves: SM2:X25519:P-256:P-521:P-384
Shared Elliptic curves: SM2:X25519:P-256:P-521:P-384
CIPHER is ECDHE-SM2-WITH-SMS4-GCM-SM3
Secure Renegotiation IS supported

我发现在s_client端输入文本在s_server端可以显示:

可能是我孤陋寡闻了哈哈哈,不过还是很开心的。

还有点疑问就是这个消息传递过去在上一篇的非双证书的s_server尝试了一下,传过去的不知道是密文还是二进制的值,反正是这个样子的,不知道有没有大佬可以给我解惑,感谢!

三、存在问题

其实这样子也只是openssl内部可以牵手,但是我尝试了国密浏览器还是不行,会报错:

2160396:error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher:ssl\statem\statem_srvr.c:1502:
shutting down SSL
CONNECTION CLOSED
ACCEPT
ssl_get_algorithm2=0x08x
ERROR
2160396:error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:ssl\record\rec_layer_s3.c:1385:SSL alert number 46
shutting down SSL
CONNECTION CLOSED

由于篇幅有限,这个问题我们留到下一篇再细说。

如果你觉得对你有帮助的话,请点赞让更多人看到,感谢!

ps:上传了一个做好的demo,也就是按照步骤生成的证书和脚本,有需要的可以下载

GMSSL双证书demo.rar

新手入坑GMSSL(二)GMSSL双证书生成相关推荐

  1. 新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯

    首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料.博客,一点点摸索总结出来的.但项目必须得做身不由己,无奈只能自己试一试了. 如果有哪里不对的地方, ...

  2. gmssl国密双证书制作

    gmssl国密双证书制作 前言 gmssl制作国密双证书 1 配置前提环境: 2 生成根密钥和证书 3 生成用户密钥,并使用根证密钥签发用户证书 4 签名证书和加密证书 5 生成pfx格式证书 6 查 ...

  3. [摘抄] 资深软件项目经理/产品经理“扯皮技巧”汇总(新手入坑必读,不定期更新)...

    左耳朵耗子 (陈皓):<开发团队的效率> http://coolshell.cn/articles/11656.html (介绍并点评了)以下几种典型的开发方式(以及他们在实践中难以避免的 ...

  4. 魔兽世界服务器存档位置,选择服务器也有大学问?新手入坑《魔兽世界》该在哪里“扎根”...

    原标题:选择服务器也有大学问?新手入坑<魔兽世界>该在哪里"扎根" <魔兽世界:暗影国度>开服至今已经五个多月了,圈内圈外都在讨论新版本的话题,不少萌新与老 ...

  5. 微信小程序入坑教程二十一:使用wx.saveImageToPhotosAlbum保存图片时通过检测scope.writePhotosAlbum权限来提醒用户是否需要授权

    摘要: 在昨天的文章<微信小程序入坑教程二十:生成海报前使用wx.downloadFile或wx.getImageInfo时潜在的坑>中提到了用户授权一事,scope.writePhoto ...

  6. 新手入坑GMSSL(一)Windows下编译GMSSL并生成CA证书

    首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料.博客,一点点摸索总结出来的,问了很多前辈和博主,但是可能都没有看到都没有回复我 = = .但项目必 ...

  7. jdbc快速入坑(二)

      这里只是对jdbc及进行简单的入门与使用,详细的教程戳这里,因为咱也是学人家的.OK,直接开整,项目代码地址:https://gitee.com/fluffycatkin/yyx-study-my ...

  8. 魔兽世界多玩服务器位置,选择服务器也有大学问?新手入坑《魔兽世界》该在哪里“扎根”...

    <魔兽世界:暗影国度>开服至今已经五个多月了,圈内圈外都在讨论新版本的话题,不少萌新与老玩家都选择了在这个版本中加入探索暗影界的行列.但面对茫茫多的区服,许多玩家都犯起了"选择困 ...

  9. 新手入坑编程,奥利给

    新的征程,新的起点.现在的我是一个准大三的学生.对于我自己来说今年参加专接本考试,很幸运的有学校上,还是很高兴的.(珍惜每一次读书的机会) 回顾在专科的时刻,竟然游戏陪伴了我绝大部分时间,有一段时间还 ...

  10. React项目-点餐后台管理系统-react框架实现后台管理系统(包含权限处理)--新手入坑必看!(一)

    点餐后台管理系统(react) 一.前言 二.项目介绍 三.相关技术 四.项目实现的功能 4.1.功能分析 4.2.项目结构 4.3.axios封装及mock数据 4.3.1.axios封装 4.3. ...

最新文章

  1. ROS~kinectv1~边缘检测
  2. mysql选择行_在mysql中选择特殊行
  3. CSP认证201409-3 字符串匹配[C++题解]:字符串处理
  4. iOS开发小技巧--高斯模糊框架的应用
  5. 孩子数学总是考不好?做好这五点,下次成绩一定好
  6. java特性,健壮性,程序设计风格及文档
  7. 超级警探大战悍匪2java_JavaWeb之会话技术
  8. 在Node中使用ES7新特征——async、await
  9. Linux非root用户如何使用80端口启动程序
  10. 银行业务头条体系推广
  11. java代码楼房销售管理系统_secondHouse2 java二手房交易管理系统,针对房地产楼房销售的 Develop 272万源代码下载- www.pudn.com...
  12. Oracle转MySQL存储函数percentile_cont(比例) WITHIN GROUP( ORDER BY to_number(分数) )用法
  13. statsmodels.regression.linear_model.RegressionResults
  14. 【转】则表达式匹配居民身份证
  15. BUMO:超级节点共建接口
  16. web视频上传和播放功能
  17. 国开计算机上机表格试题答案,国家开放大学《计算机应用基础》考试与答案形考任务模块3模块3Excel2010电子表格系统—客观题答案...
  18. 光电效应和普朗克常量的测量
  19. IPTV用户今年或过亿 运营商转型+政策双驱动
  20. HTML期末大作业~ 大话西游之大圣娶亲电影4页面 ~学生网页设计作业源码(HTML+CSS+JS)...

热门文章

  1. Ubuntu扩展磁盘内存
  2. SpringMVC项目报错500的可能解决方法
  3. 数据挖掘 文本分类(四)批处理分词
  4. 建模专题1:石墨烯-氧化石墨烯及各种纳米材料体系的构建方法
  5. vscode 是干什么用的_vscode是干嘛用的
  6. 华为AC6605二层组网,配置无线漫游
  7. Unity Shader案例之——阴阳师画符效果
  8. 《高性能MySQL》读书笔记(1~6章)
  9. [转载]世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  10. 中国石油大学《马克思主义基本原理》第二阶段在线作业