通过openssl实现自签国密双证书详细教程

这篇具有很好参考价值的文章主要介绍了通过openssl实现自签国密双证书详细教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

openssl 1.1.1+ 版本增加了对SM2 的支持,所以我们就能直接使用这些版本的opsnssl 生成 SM2的公私钥对

openssl 生成国密证书请求文件

查看openssl 版本

$ openssl version

查看是否支持sm2算法

$ openssl ecparam -list_curves | grep SM2

SM2 : SM2 curve over a 256 bit prime field

生成sm2私钥文件

$ openssl ecparam -genkey -name SM2 -out sign.key
$ cat sign.key 
-----BEGIN EC PARAMETERS-----    
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIOisvcLOU0q23GUTwx+lC4HOQRBvRT7QrKIUnqf9Ns+toAoGCCqBHM9V
AYItoUQDQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk
7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==
-----END EC PRIVATE KEY-----

BggqgRzPVQGCLQ==是椭圆曲线的关键参数,对应secp256k1标识,用secp256k1生成私钥每次私钥是不同的,但EC PARAMETERS都是相同的。

生成sm2公钥文件(可忽略)

$ openssl ec -in sign.key -pubout -out pub.key

read EC key
writing EC key
$ cat pub.key 
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRb
AnRFNsTPyCn6OU7yJDTNG2tk7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==
-----END PUBLIC KEY-----

生成的是非压缩格式的公钥。

查看密钥对

openssl ec -in guomi/sign.key -text -noout

read EC key
Private-Key: (256 bit)
priv:
    a4:61:94:16:49:da:b2:19:84:44:e1:0b:be:43:bf:
    ec:99:0d:42:e4:73:25:9e:f4:93:29:82:5b:53:bd:
    07:62
pub:
    04:dd:81:1a:17:41:13:4b:8f:d5:df:81:1c:34:2b:
    d8:2a:5d:f9:87:3d:7c:be:9f:f8:b7:5e:94:f7:f1:
    28:bf:c4:13:bf:78:f0:9a:18:83:74:0a:7a:65:bd:
    86:32:ba:b1:65:ec:cb:f2:5a:f2:16:27:a9:5e:06:
    3a:e2:c1:3e:9a
ASN1 OID: SM2

生成p10请求文件(PKCS#10申请书(CSR))

openssl req -new -key sign.key  -out sign.req

输入国家、城市、公司名称等

$ cat sign.req 
-----BEGIN CERTIFICATE REQUEST-----
MIIBGzCBwgIBADBgMQswCQYDVQQGEwJDTjEQMA4GA1UECAwHQ0hORUdEVTEQMA4G
A1UEBwwHQ0hFTkdEVTEOMAwGA1UECgwFS0FZQUsxDjAMBgNVBAsMBUtBWUFLMQ0w
CwYDVQQDDARLQVlLMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAElYOHcUAailvi
3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk7nOWc9qgXH12cNyDsZCQjIo3
YSCe1o4hU6AAMAoGCCqGSM49BAMCA0gAMEUCIHvaP7S0dQ4wWAmx1SraMCbvvVSB
8CT54EObnM2sVO9QAiEA2KmgUCO/oj5Q119Fqu3/Ig8TjbKSaJ8+zUxKsTn1k3I=
-----END CERTIFICATE REQUEST-----

CFCA获取两码

CA机构联系获取两码
申请测试证书发邮件到 support@cfca.com.cn 这个邮箱,邮件内容说明单位名称,所需证书类型,数量。CFCA相关负责人员收到邮件后会免费给发两码。
邮件发送内容:

单位名称:*******股份有限公司
所需证书类型:OCA31 国密双证 SM2
数量 1套

CFCA机构回复

证书DN ********************
序列号 405822****
授权码 4XYACU****

CFCA登录申请证书

普通SM2服务器测试证书下载
openssl 生成国密证书,国密证书,安全,java,密码学
点击下一步 生成内容加签证书 加密证书 私钥

openssl 生成国密证书,国密证书,安全,java,密码学

获取sm2加密私钥内容-借助天威诚信工具

通过天威诚信的工具获取机密私钥内容
openssl 生成国密证书,国密证书,安全,java,密码学

1.签名证书私钥--对应sign.key内
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIOisvcLOU0q23GUTwx+lC4HOQRBvRT7QrKIUnqf9Ns+toAoGCCqBHM9V
AYItoUQDQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk
7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==
-----END EC PRIVATE KEY-----

2.加密证书 ---对应cert.cer
-----BEGIN CERTIFICATE-----
MIIC8jCCApegAwIBAgIFQFgigRQwDAYIKoEcz1UBg3UFADBhMQswCQYDVQQGEwJD
TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y
aXR5MSAwHgYDVQQDDBdDRkNBIEFDUyBURVNUIFNNMiBPQ0EzMTAeFw0yMzA3MTgw
NjA2MjZaFw0yMzEwMTgwNjA2MjZaMIGeMQswCQYDVQQGEwJDTjERMA8GA1UECgwI
T0NBMzFTTTIxFzAVBgNVBAsMDkxvY2FsIFJBIE9DQTMxMRkwFwYDVQQLDBBPcmdh
bml6YXRpb25hbC0yMUgwRgYDVQQDDD9DRkNBQOaxn+iLj+W4uOeGn+WGnOadkeWV
huS4mumTtuihjOiCoeS7veaciemZkOWFrOWPuEBaMTIzNDU2QDIwWTATBgcqhkjO
PQIBBggqgRzPVQGCLQNCAAS0ywNti6hAkh/NAMTsYEVhNOxbWUkUzQzqVP4uJLu8
HYPMchX5g/eCYRtcFPgKA1GNI9QMa618fHtCKWxhloeOo4H7MIH4MD8GCCsGAQUF
BwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDovL29jc3B0ZXN0LmNmY2EuY29tLmNu
OjgwL29jc3AwHwYDVR0jBBgwFoAUBMe8+VkBaT6MNDYgYhg83ry1uwwwDAYDVR0T
AQH/BAIwADA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vMjEwLjc0LjQyLjMvT0NB
MzEvU00yL2NybDIyMC5jcmwwDgYDVR0PAQH/BAQDAgM4MB0GA1UdDgQWBBRlgMoK
1ZwBzzdRyPRIVpie1mE/BzAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQw
DAYIKoEcz1UBg3UFAANHADBEAiBazncX4OI41e75Bs37MSFGE2k8qwoBXso5n+Vu
KbBVaQIgX6paf1HzCuIC0efy6/EGVwHRroHB99n5yrjBjS5AG94=
-----END CERTIFICATE-----

3.加密私钥密文 --生成的SM2加密私钥证书
-----BEGIN EC PRIVATE KEY-----
MIHuMAkGByqBHM9VAWgwegIhAORoB8gn26uOf93GhBSfvXxRVnKNx3n7a0+wpcimTFt+AiEA3YPUVyVb4ygnQkotqbMcWM0CJOzQJQDGNZGZZDbtGeMEILEP+DMebsZzsNeojT4v3ZivAQbqew5DmpZqX3lEHXUHBBDwzSc1heT2HQtFoQtjhzatA0IABLTLA22LqECSH80AxOxgRWE07FtZSRTNDOpU/i4ku7wdg8xyFfmD94JhG1wU+AoDUY0j1AxrrXx8e0IpbGGWh44DIQCsN4EHB39+NSdLknSVksgIWkpmaC0C222GawFF03sNWQ==
-----END EC PRIVATE KEY-----

ps:将证书签发邮件中的“以下是您的签名证书”代码的文本复制出来(包括“—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”)粘贴到记事本等文本编辑器中。为保障服务器证书在客户端的兼容性,服务器证书需要安装中级CA证书。 在服务器证书代码文本结尾,回车换行不留空行,粘贴证书签发邮件中的“以下是您的中级CA证书”部分里的第一段CA证书和第二段的内容(包括“—–BEGIN CERTIFICATE—–”和“—–END CERTIFICATE—–”),每串证书代码之间均需要使用回车换行不留空行

生成sm2私钥证书-sm2结尾

package com.dcep.demo;

import cfca.sadk.algorithm.sm2.SM2PrivateKey;
import cfca.sadk.asn1.pkcs.PKCS12_SM2;
import cfca.sadk.org.bouncycastle.asn1.ASN1Primitive;
import cfca.sadk.org.bouncycastle.asn1.ASN1Sequence;
import cfca.sadk.org.bouncycastle.asn1.DEROctetString;
import cfca.sadk.util.Base64;
import cfca.sadk.x509.certificate.X509Cert;

/**
 * @version 1.0
 * @Description :
 * @date 2023/8/1
 */
public class CADemo {

    private static final String PUBLIC = "PUBLIC";


    public static String genSm2(String pwd,String priKeyBase64,String pubCertPath) throws Exception{
        ASN1Sequence priKeySeq = (ASN1Sequence) ASN1Primitive.fromByteArray(Base64.decode(priKeyBase64));
        byte[] d = ((DEROctetString)priKeySeq.getObjectAt(1)).getOctets();// sm2私钥d值
        X509Cert signCert = new X509Cert(pubCertPath);
        byte[] bytes = PKCS12_SM2.generateSM2Data(signCert, new SM2PrivateKey(d, null, null), pwd);// base64格式
        String base64SM2P12Text = new String(bytes);
        return formatCert(base64SM2P12Text,76,"");
    }

    /**
     * 格式化证书
     * @param certContent
     * @param len
     * @return
     */
    private static String formatCert(String certContent, int len, String type) {
        String tmp = "";
        if (len < 0) {
            return "";
        }
        if (certContent.length() < len) {
            return certContent;
        }

        int rows = (certContent.length() + len - 1) / len;
        for (int i = 0; i < rows; i++) {
            if (i == rows - 1) {
                tmp += certContent.substring(i * len);
            } else {
                tmp += certContent.substring(i * len, i * len + len) + "\r\n";
            }

        }

        if (PUBLIC.equals(type)) {
            tmp = String.format("-----BEGIN CERTIFICATE-----\r\n%s\r\n-----END CERTIFICATE-----", tmp);
        }
        return tmp;
    }



    public static void main(String[] args) throws Exception {
        String priKey = "MHcCAQEEIOisvcLOU0q23GUTwx+lC4HOQRBvRT7QrKIUnqf9Ns+toAoGCCqBHM9VAYItoUQDQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==";
        String pwd="123456";
        String pubCertPath="conf/cert/psbc/bank_sign.cer";

        String s = genSm2(pwd, priKey, pubCertPath);
        System.out.println(s);

    }

}

解密代码(解密出对称密钥,密钥文件需要sm1进行解密)

针对从cfca获取到的密钥文件进行解密获取对称密钥,仅做了解,可以通过硬件通过进行生成;文章来源地址https://www.toymoban.com/news/detail-758441.html

public class CADemo {
    
    public static void main(String[] args) throws Exception {
        String priKey = "MHcCAQEEIOisvcLOU0q23GUTwx+lC4HOQRBvRT7QrKIUnqf9Ns+toAoGCCqBHM9VAYItoUQDQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==";
        String pubKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAElYOHcUAailvi3C5Cg6nM/Z+N9HRbAnRFNsTPyCn6OU7yJDTNG2tk7nOWc9qgXH12cNyDsZCQjIo3YSCe1o4hUw==";

        X509Cert signCert = new X509Cert("conf/cert/psbc/bank_sign.cer");

        ASN1Sequence priKeySeq = (ASN1Sequence) ASN1Primitive.fromByteArray(Base64.decode(priKey));
        byte[] d = ((DEROctetString)priKeySeq.getObjectAt(1)).getOctets();// sm2私钥d值

        ASN1Sequence pubKeySeq = (ASN1Sequence) ASN1Primitive.fromByteArray(Base64.decode(pubKey));
        byte[] pubKeyByte = ((DERBitString)pubKeySeq.getObjectAt(1)).getBytes();// sm2公钥

        if (pubKeyByte.length == 65) {
            pubKeyByte = Arrays.copyOfRange(pubKeyByte, 1, pubKeyByte.length); // sm2公钥
        }

        String encfca = "MIHuMAkGByqBHM9VAWgwegIhAORoB8gn26uOf93GhBSfvXxRVnKNx3n7a0+wpcimTFt+AiEA3YPUVyVb4ygnQkotqbMcWM0CJOzQJQDGNZGZZDbtGeMEILEP+DMebsZzsNeojT4v3ZivAQbqew5DmpZqX3lEHXUHBBDwzSc1heT2HQtFoQtjhzatA0IABLTLA22LqECSH80AxOxgRWE07FtZSRTNDOpU/i4ku7wdg8xyFfmD94JhG1wU+AoDUY0j1AxrrXx8e0IpbGGWh44DIQCsN4EHB39+NSdLknSVksgIWkpmaC0C222GawFF03sNWQ==";

        byte[] encfcaByte = Base64.decode(encfca);
        ASN1Sequence seq = (ASN1Sequence) ASN1Primitive.fromByteArray(encfcaByte);
        ASN1Sequence objectAt = (ASN1Sequence) seq.getObjectAt(1);
        byte[] X = ((ASN1Integer)objectAt.getObjectAt(0)).getValue().toByteArray();
        if (X.length == 33) {
            X = Arrays.copyOfRange(X, 1, X.length); // X值
        }
        byte[] Y = ((ASN1Integer)objectAt.getObjectAt(1)).getValue().toByteArray();
        if (Y.length == 33) {
            Y = Arrays.copyOfRange(Y, 1, Y.length); // Y值
        }
        byte[] hash = ((DEROctetString)objectAt.getObjectAt(2)).getOctets(); // sm2加密机构中的Hash

        byte[] cipher = ((DEROctetString)objectAt.getObjectAt(3)).getOctets();// sm2加密结构中的c值

        byte[] bcFormat = new byte[1 + X.length + Y.length + hash.length + cipher.length];
        System.arraycopy(Hex.decode("04"), 0, bcFormat, 0, 1);
        System.arraycopy(X, 0, bcFormat, 1, X.length);
        System.arraycopy(Y, 0, bcFormat, 1 + X.length, Y.length);
        System.arraycopy(hash, 0, bcFormat, 1 + X.length + Y.length, hash.length);
        System.arraycopy(cipher, 0, bcFormat, 1 + X.length + Y.length + hash.length, cipher.length);


        byte[] enPub = ((DERBitString) seq.getObjectAt(2)).getBytes();// 加密公钥信息
        byte[] priCipher = ((DERBitString) seq.getObjectAt(3)).getBytes();// 加密私钥密信息



        SM2 sm2 = new SM2(d, null, null);//创建SM2
        byte[] symmetricKeyByte = sm2.decrypt(bcFormat, KeyType.PrivateKey);
        System.out.println(HexUtil.encodeHexStr(symmetricKeyByte));// 2de4e6b1bbc95eb47ed79a02fd415f17

    }
    
}

到了这里,关于通过openssl实现自签国密双证书详细教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通过openssl生成pfx证书

    通过centos7上自带的openssl工具来生成。首先创建一个pfxcert目录。然后进入此目录。 1.生成.key文件(内含被加密后的私钥),要求输入一个自定义的密码 [root@localhost cert]# openssl genrsa -des3 -out server.key 2048 Generating RSA private key, 2048 bit long modulus ..........+++ ..........+++ e is 65537 (0x100

    2024年02月01日
    浏览(38)
  • 通过openSSL生成自签名的SSL证书

    自签名证书:就是 指的根证书,就是颁发者:和颁发给: 是相同的。证书的签名是用证书里的公钥对应的私钥进行的签名。这样的证书除非是受信任的颁布机构颁发f,一般是不被第三方信任。一般用于内部使用及测试使用。 下面介绍生成证书的方法: 1. 生成私 钥 要创建

    2023年04月17日
    浏览(46)
  • Linux(openssl):通过编程检查证书是否为selfsign

     可以通过openssl提供的库函数验证 Linux(openssl):创建selfsign证书-CSDN博客 生成的正式是否为selfsign 

    2024年02月06日
    浏览(35)
  • 【HTTPS】通过OpenSSL在Windows上生成Https证书

    下载和安装OpenSSL 可以去百度下载OpenSSL Win64,也可以从下面的地址下载 OpenSSL-Win64-3.0.7.zip 生成证书 切换到openssl/bin目录,执行以下指令生成证书 创建自签名根证书 openssl req -new -x509 -days 365 -extensions v3_ca -keyout crt/ca.key -out crt/ca.crt 创建服务端证书 openssl genrsa -out crt/server.key 2

    2024年02月08日
    浏览(42)
  • Nginx解决通过openssl自签名证书访问Https报不安全告警的问题

    nginx代理设置自签ssl证书并进行https方式访问,浏览器中会报不安全的告警,记录一下处理过程 本文内容摘自CSDN博主「Dylanu」的原创文章 解决https网站通过nginx+openssl自签名证书访问,在谷歌浏览器报不安全告警的问题 使用指定-subj “/C=CN/ST=MyProvince/L=MyCity/O=MyOrganization”,生成根

    2024年02月03日
    浏览(42)
  • 自签内网IP https证书并部署

     生成CA根证书私钥  使用私钥生成CA根证书 注:这里依次需要输入国家 CN、省份:SHANGHAI、城市:SHANGHAI、组织名称:XXX、组织代码:XXX、自签的证书IP或域名:192.168.140.120、邮箱:xxx@qq.com  生成内外 IP 的私钥  使用私钥生成证书请求文件 注:这里与上述 CA的操作一致(填写

    2024年01月17日
    浏览(31)
  • centos7 使用openssl 配置证书服务器并颁发证书(史上最详细版本)

    最近接到一个任务:由于我们的产品涉及使用数字证书进行签名、签章,如果需要使得签名签章暗具有法律效力,就必须使用权威CA中心颁发的数字证书,就需要小钱钱;但是对于测试来说,就可以适当减少小钱钱的使用;于是,可以考虑自建证书服务器,自己颁发证书,然

    2024年01月16日
    浏览(61)
  • 使用nginx提供https端点,实现不修改浏览器地址(不触发重定向)转发网络流量,附生成自签ssl证书最简单的方法(2个命令)

    近日笔者需要实现一个网络流量转发的需求。要求很简单:将浏览器的请求转发到一个指定的域名,需要提供一个https端口并且把http端口转发到https端口。由于笔者对nginx的认知有限,因此磕磕绊绊研究了一阵,将结果写出来,以供其他有类似需求的同学参考对照。 nginx的官方

    2024年02月08日
    浏览(67)
  • CentOS7自签SSL证书并配置nginx

    一、生成SSL证书 1、安装依赖包       yum install -y openssl openssl-devel 2、生成私钥,会让你输入一个 4~2048 位的密码,你需要暂时记住这个密码       openssl genrsa -des3 -out server.key 2048 输入两遍相同的密码 3、生成CSR(Certificate Signing Request 证书签名请求 ) 输入以下命令:       op

    2024年02月12日
    浏览(44)
  • Nginx配置https协议,基于Linux自签(OPENSSL生成SSL自签证书)

    第1步:生成私钥 执行如下命令生成一个RSA私钥 //生成rsa私钥,des3算法,1024位强度,ssl.key是秘钥文件名。 openssl genrsa -des3 -out ssl.key 1024 然后他会要求你输入这个key文件的密码,由你随便设置。 由于以后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。 但是生

    2024年01月21日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包