jntass / TASSL

此仓库已停止维护,请移步https://github.com/jntass/TASSL-1.1.1
http://www.tass.com.cn
Other
291 stars 106 forks source link

怎么生成证书? #4

Open xmammoths opened 6 years ago

xmammoths commented 6 years ago

运行如下命令: openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:sm2p256v1 -pkeyopt ec_param_enc:named_curve -out ca.key 报错误信息: parameter setting error 140470194325160:error:100C608D:elliptic curve routines:PKEY_EC_CTRL_STR:invalid curve:ec_pmeth.c:709: 有没有说明如何生成测试证书?

然后再运行: openssl ciphers 输出结果里面没有SM2,是否支持SM2?

taolinke commented 6 years ago

这是一个签发自签名证书的示例:

输出结果如下: [root@vsmHost12 apps]# cat sm2.key -----BEGIN EC PARAMETERS----- BggqgRzPVQGCLQ== -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- MHcCAQEEIHNY3vnr23ni2aJqh+/PzXqUJqFtb2ecFXNd3i+BgJTuoAoGCCqBHM9V AYItoUQDQgAEuMWw+EuLV7Ic3LInZew2P3ukF2dBySagND8jQmTXKS+nhQyhckNN eEjhrq9pO0tT9e4lVXRZCjWj1bqH2I8gUA== -----END EC PRIVATE KEY-----

[root@vsmHost12 apps]# cat ca.csr -----BEGIN CERTIFICATE REQUEST----- MIH0MIGaAgEAMDgxDTALBgNVBAMMBEpOVEExCzAJBgNVBAsMAkJKMQ0wCwYDVQQK DARUQVNTMQswCQYDVQQGEwJDTjBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABLjF sPhLi1eyHNyyJ2XsNj97pBdnQckmoDQ/I0Jk1ykvp4UMoXJDTXhI4a6vaTtLU/Xu JVV0WQo1o9W6h9iPIFCgADAKBggqgRzPVQGDdQNJADBGAiEAv5zKLeUXbzQ37Ml8 DRKtWL6EiIiJAqwyIvYbO9Qan6oCIQDlPlfmTXaqkYFHBPGg3xJsjcFt7QzGWKuy 5daT7M+hvQ== -----END CERTIFICATE REQUEST-----

[root@vsmHost12 apps]# cat ca-v3.crt -----BEGIN CERTIFICATE----- MIIB8zCCAZqgAwIBAgIJAIR+ZCr3jonMMAoGCCqBHM9VAYN1MDgxDTALBgNVBAMM BEpOVEExCzAJBgNVBAsMAkJKMQ0wCwYDVQQKDARUQVNTMQswCQYDVQQGEwJDTjAe Fw0xODAxMjEwNTIxMTJaFw0yODAxMTkwNTIxMTJaMDgxDTALBgNVBAMMBEpOVEEx CzAJBgNVBAsMAkJKMQ0wCwYDVQQKDARUQVNTMQswCQYDVQQGEwJDTjBZMBMGByqG SM49AgEGCCqBHM9VAYItA0IABLjFsPhLi1eyHNyyJ2XsNj97pBdnQckmoDQ/I0Jk 1ykvp4UMoXJDTXhI4a6vaTtLU/XuJVV0WQo1o9W6h9iPIFCjgYwwgYkwDwYDVR0T AQH/BAUwAwEB/zAmBglghkgBhvhCAQ0EGRYXVEFTUyBIU00gQ0EgQ2VydGlmaWNh dGUwHQYDVR0OBBYEFJ5bjHqBhAY9eK/CDhKZuqjkCZ+1MB8GA1UdIwQYMBaAFJ5b jHqBhAY9eK/CDhKZuqjkCZ+1MA4GA1UdDwEB/wQEAwIBhjAKBggqgRzPVQGDdQNH ADBEAiB5TEUeE158G0y+1qdvlKT/B5RnetIIPukJqlr4P4LkYwIgQgyi2ttHtlhy /tyhKZAJwdLX+2mYaW7b2uxpX72SfCA= -----END CERTIFICATE-----

其中zz.cnf如下: [req] distinguished_name = req_distinguished_name [req_distinguished_name]

v3-ca.ext如下:

basicConstraints = critical, CA:true nsComment = TASS HSM CA Certificate subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = critical, digitalSignature, cRLSign, keyCertSign

jntass commented 6 years ago

tassl中,SM2曲线的名称就是SM2,而不是sm2p256v1; openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:SM2 -pkeyopt ec_param_enc:named_curve -out ca.key

jntass commented 6 years ago

openssl cihpers输出的是: ECC-SM4-SM3 ECDHE-SM4-SM3 这是国密TLSv1.1的密码套件之二 关于这点,你可以查看:GMT 0024-2014《SSL VPN技术规范》

jntass commented 6 years ago

tassl生成TLS测试证书的完整步骤: 1、在当前目录下创建一个名为"my"的目录; 2、将openssl.cnf复制到当前目录下(位于tassl的安装目录的ssl子目录中); 3、修改当前目录的openssl.cnf,方式如下:   A、[req]选项中添加或者修改:default_md = sm3   B、修改[v3_req]选项内容为:     basicConstraints = CA:FALSE     keyUsage = nonRepudiation, digitalSignature   C、添加[v3enc_req]选项,其内容:     basicConstraints = CA:FALSE     keyUsage = keyAgreement, keyEncipherment, dataEncipherment 4、生成SM2参数文件   openssl ecparam -name SM2 -out SM2.pem

5、生成ca证书   openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout CA.key.pem -newkey ec:SM2.pem -new -out CA.req.pem   openssl x509 -req -days 7300 -in CA.req.pem -extfile ./openssl.cnf -extensions v3_ca -signkey CA.key.pem -out CA.cert.pem   cat CA.cert.pem > CA.pem   cat CA.key.pem >> CA.pem   rm CA.key.pem CA.req.pem CA.cert.pem

6、生成SSL服务端(或客户端)签名证书   openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout my/svr.key.pem -newkey ec:SM2.pem -new -out my/svr.req.pem   openssl x509 -req -days 365 -in my/svr.req.pem -extfile ./openssl.cnf -extensions v3_req -signkey CA.pem -out my/svr.cert.pem   cat my/svr.cert.pem > my/svr.pem   cat my/svr.key.pem >> my/svr.pem   rm -f my/svr.cert.pem my/svr.key.pem my/svr.req.pem

7、生成SSL服务端(或客户端)加密证书   openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout my/svrenc.key.pem -newkey ec:SM2.pem -new -out my/svrenc.req.pem   openssl x509 -req -days 365 -in my/svrenc.req.pem -extfile ./openssl.cnf -extensions v3enc_req -signkey CA.pem -out my/svrenc.cert.pem   cat my/svrenc.cert.pem > my/svrenc.pem   cat my/svrenc.key.pem >> my/svrenc.pem   rm -f my/svrenc.cert.pem my/svrenc.key.pem my/svrenc.req.pem

8、测试CNTLS   服务端:openssl s_server -accept 4433 -CAfile CA.pem -cert my/svr.pem -enc_cert my/svrenc.pem   客户端:(假设你已经使用第六步和第七步,生成了客户端的证书,签名证书为cli.pem,加密证书为:clienc.pem)     测试ECC-SM4-SM3套件:openssl s_client -connect 127.0.0.1:4433 -cntls     测试ECDHE-SM4-SM3套件:openssl s_client -connect 127.0.0.1:4433 -CAfile CA.pem -cert my/cli.pem -enc_cert my/clienc.pem -cntls

liclicli commented 6 years ago

您好,按照上述步骤在启动服务端的时候出现问题,求帮助 openssl s_server -accept 4433 -CAfile CA.pem -cert my/svr.cert.pem -key my/svr.key.pem -enc_cert my/svrenc.cert.pem -enc_key my/svrenc.key.pem Using default temp DH parameters error setting private key 140364807919272:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:340:

xmammoths commented 6 years ago

收到,用这个生成了根证书,然后修改ext文件签发出加密和签名证书,尝试成功了,谢谢。

xmammoths commented 6 years ago

样例生成的应该是根证书,需要用这个根证书再去签发证书。ext文件keyusage里面增加keyEncipherment 我生成了两个证书,一个服务器端,一个客户端。修改了demo里面的代码,服务器端主要修改文件名,客户端还需要增加key文件的宏定义。 通信成功! 赞Tassl!

liclicli commented 6 years ago

楼上能不能加个好友,我最近也在弄这个,但是没有成功;qq: 420344414

memdumper commented 6 years ago

@xmammoths 能具体怎么修改吗,我这里测试一样的错误,./openssl s_server -accept 4433 -CAfile CA.pem -cert my/svr.pem -enc_cert my/svrenc.pem Using default temp DH parameters error setting private key 139813839013544:error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch:x509_cmp.c:340:

xmammoths commented 6 years ago

我也是刚入门,贴一下我的测试过程,其中签名证书和加密证书试用了同一套证书,其实可以生成不同证书分开使用的。

1.生成CA自签证书 (1)./openssl ecparam -genkey -name SM2 -out ca.key (2)./openssl req -sm3 -new -x509 -days 365 -key ca.key -out ca.pem 2.生成服务器加密证书,并用CA根证书签名 (1) ./openssl ecparam -genkey -name SM2 -out serverT1.key (2) ./openssl req -sm3 -new -key serverT1.key -out serverT1.csr (3) ./openssl x509 -req -sm3 -days 3650 -extfile v3-cer.ext -CA ca.pem -CAkey ca.key -CAcreateserial -in serverT1.csr -out serverT1.pem 其中 v3-cer.ext文件内容为: basicConstraints = critical, CA:true nsComment = TASS HSM CA Certificate subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = digitalSignature, keyEncipherment, cRLSign, keyCertSign

  1. 然后重复第2步,生成服务器签名证书、客户端加密、客户端签名证书。修改命令里面serverT1为其他即可。我的例子里面加密签名用了同一个证书,最终有serverT1.pem和clientT1.pem两个证书。
  2. 源代码目录中,有一个Tassl_demo/tls目录,修改里面的代码,实现tls通信。修改后内容为: sm2svr.c: 90-97行

    define SM2_SERVER_CERT "serverT1.pem"

    define SM2_SERVER_KEY "serverT1.key"

define SM2_SERVER_ENC_CERT "serverT1.pem"

define SM2_SERVER_ENC_KEY "serverT1.key"

define SM2_SERVER_CA_CERT "ca.pem"

define SM2_SERVER_CA_PATH "."

sm2tls.c: 77、78行增加两个key的定义

define CLIENT_S_CERT "clientT1.pem"

define CLIENT_S_KEY "clientT1.key"

define CLIENT_E_CERT "clientT1.pem"

define CLIENT_E_KEY "clientT1.key"

129行、140行两个PrivateKey文件分别设置为对应的key文件: if (SSL_CTX_use_PrivateKey_file(ctx, CLIENT_S_KEY, SSL_FILETYPE_PEM) <= 0)

if (SSL_CTX_use_enc_PrivateKey_file(ctx, CLIENT_E_KEY, SSL_FILETYPE_PEM) <= 0)

最后编译运行,tls通信成功。

memdumper commented 6 years ago

@xmammoths 感谢分享。

liclicli commented 6 years ago

@xmammoths 非常感谢分享,分享答案实测完全可用,现在已顺利跑过demo.

memdumper commented 6 years ago

@xmammoths @liclicli 我用xmammoths方法生成的证书,可以使用 openssl s_server -accept 4433 -CAfile ca.pem -cert serverT1.pem -key serverT1.key openssl s_client -connect localhost:4433 -cntls 但不是ECC-SM4-SM3,是 CIPHER is ECDHE-ECDSA-AES256-SHA 换成指定加密证书 openssl s_server -accept 4433 -CAfile ca.pem -cert serverT1.pem -key serverT1.key -enc_cert svrenc.pem -enc_key svrenc.key openssl s_client -connect localhost:4433 -cntls -cipher ECC-SM4-SM3 就报错了 ERROR 9024:error:1408A0C1:SSL routines:ssl3_get_client_hello:no shared cipher:.\ssl\s3 _srvr.c:1447: 不知道是代码问题还是跟证书有关

jntass commented 6 years ago

是不是证书有问题? 我们刚刚上传了sm2 tls 测试证书的生成工具,在Tassl_demo/mk_tls_cert下,你可以试试看。

memdumper commented 6 years ago

@jntass 用脚本生成的证书 ,openssl s_server -accept 4433 -CAfile CA.pem -cert SS.cert.pem -key SS.key.pem -enc_cert SE.cert.pem -enc_key SE.key.pem 执行没有提示错误了 error setting private key 客户端连接成功 openssl s_client -connect 127.0.0.1:4433 -cntls

Cipher : ECC-SM4-SM3 Session-ID: 156FCA63A893A4F99D618126236FC580EBE361C03F19DB941B503974A16F3C18 非常感谢!

memdumper commented 6 years ago

使用360国密版浏览器访问服务器,浏览器小锁头能看到自签的sm2证书,但是提示服务器证书不可信。

suxiaoyv commented 6 years ago

@memdumper 最近还在搞这个吗?请问当时怎么使用360国密浏览器访问的服务器啊?360国密浏览器是配置了什么东西呢?这边拿到一个文档

用法有两种:

1  客户端放签名证书:

可以直接把签名证书放到浏览器指定的配置文件(如果是证书链,则所有证书都要放进去)
如果浏览器安装在C盘,就是类似路径:
C:\Users\xuexiangxu\AppData\Roaming\360se6\Application\User Data\Default\ctl\ctl.dat
附件ctl.dat是签名证书的样例文件

mini_installer_sm.exe 可以读取明文的证书ctl.dat

2  
客户端已经预埋了根证书,服务器可以用sm2-site_all.pem作为签名证书。

在ctl.dat中配置了服务器的CA证书、签名证书、加密证书,还是不行。

大家有人成功的吗?分享一下

@jntass 这个以什么为依据做测试的呢?只是 s_server 和 s_client 联通吗?

suxiaoyv commented 6 years ago

对比了一下 SM2certgen.sh 脚本,上边 @jntass 发的步骤里边生成签名证书、加密证书的两个部分不太一样,贴一下新的,方便大家看下~

tassl生成TLS测试证书的完整步骤:
1、在当前目录下创建一个名为"my"的目录;
2、将openssl.cnf复制到当前目录下(位于tassl的安装目录的ssl子目录中);
3、修改当前目录的openssl.cnf,方式如下:
A、[req]选项中添加或者修改:default_md = sm3
B、修改[v3_req]选项内容为:
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature
C、添加[v3enc_req]选项,其内容:
basicConstraints = CA:FALSE
keyUsage = keyAgreement, keyEncipherment, dataEncipherment
4、生成SM2参数文件
openssl ecparam -name SM2 -out SM2.pem
5、生成ca证书
./openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout CA.key.pem -newkey ec:SM2.pem -new -out CA.req.pem
./openssl x509 -req -days 7300 -in CA.req.pem -extfile ./openssl.cnf -extensions v3_ca -signkey CA.key.pem -out CA.cert.pem
./openssl x509 -in CA.cert.pem -issuer -subject > CA.pem
cat CA.key.pem >> CA.pem
rm CA.key.pem CA.req.pem CA.cert.pem
6、生成SSL服务端(或客户端)签名证书
./openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout my/svr.key.pem -newkey ec:SM2.pem -new -out my/svr.req.pem
./openssl x509 -req -days 365 -in my/svr.req.pem -CA CA.cert.pem -CAkey CA.key.pem -extfile ./openssl.cnf -extensions v3_req -out my/svr.cert.pem -CAcreateserial
./openssl x509 -in my/svr.cert.pem -issuer -subject > my/svr.pem
cat my/svr.key.pem >> my/svr.pem
rm -f my/svr.cert.pem my/svr.key.pem my/svr.req.pem
7、生成SSL服务端(或客户端)加密证书
./openssl req -config ./openssl.cnf -nodes -subj "/C=CN/ST=BJ/L=HaiDian/O=Beijing JNTA Technology LTD./OU=SORB of TASS/CN=Test CA (SM2)" -keyout my/svrenc.key.pem -newkey ec:SM2.pem -new -out my/svrenc.req.pem
./openssl x509 -req -days 365 -in my/svrenc.req.pem -CA CA.cert.pem -CAkey CA.key.pem -extfile ./openssl.cnf -extensions v3enc_req -out my/svrenc.cert.pem -CAcreateserial
./openssl x509 -in my/svrenc.cert.pem -issuer -subject > my/svrenc.pem
cat my/svrenc.key.pem >> my/svrenc.pem
rm -f my/svrenc.cert.pem my/svrenc.key.pem my/svrenc.req.pem
8、测试CNTLS
服务端:./openssl s_server -accept 4433 -CAfile CA.pem -cert my/svr.pem -enc_cert my/svrenc.pem -debug
客户端:(假设你已经使用第六步和第七步,生成了客户端的证书,签名证书为cli.pem,加密证书为:clienc.pem)
测试ECC-SM4-SM3套件:./openssl s_client -connect 127.0.0.1:4433 -cntls -debug
测试ECDHE-SM4-SM3套件:./openssl s_client -connect 127.0.0.1:4433 -CAfile CA.pem -cert my/cli.pem -enc_cert my/clienc.pem -cntls