精华内容
下载资源
问答
  • 使用方法见:... 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 适配了一些硬件设备和国密浏览器 3. 支持国密SSL双向认证 4. 将过期的国密证书替换为新证书
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书
  • 1. 国密算法的JCE实现,SM2、SM3、SM4算法,以及国密证书和密钥存储的DCKS文件格式 2. 适用于JDK7及以上 3. 适用于Android API 21平台及以上 4. 导出的PEM数据格式与OPENSSL保持一致,新增可导入的私钥格式
  • AndroidStudio示例工程,Android API 21及以上 1. SM2密钥对的生成功能 2. SM2密钥对的还原功能 3. SM2算法的非对称加解密功能 ...7. 大宝CA版本Keystore文件(DCKS文件)存储SM2密钥对和国密数字证书的功能
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/87875482 1. 修改了以前版本中的一些BUG 2. 可以适配360、密信、海泰等国密浏览器 3. 支持国密SSL双向认证
  • 国密SSL协议的JAR包-大宝CA版本 GM-SSL SM2 PKI SSL DoubleCA。 大宝CA版本的国密SSL的JSSE通信jar包。 完成服务端-客户端的国密SSL双向通信和身份认证。 GM-SSL SM2 PKI SSL DoubleCA
  • 最新版本大宝CA国密SSL的JAR包和示例代码下载地址: https://download.csdn.net/download/upset_ming/11751999 授权码保留好,如果授权数据丢失,可凭授权码在 PP商业软件自主授权平台  找回授权数据  

    系统要求
    1. Windows系统、Linux系统、Mac系统
    2. JDK7及以上
    3. JDK使用无限制的安全策略文件

     

    服务端核心代码
            Security.addProvider(new DoubleCA());
            Security.addProvider(dcsse);
            // 密钥管理器
            KeyStore sm2ServerKeyStore = KeyStore.getInstance("DCKS");// 证书库格式
            sm2ServerKeyStore.load(new FileInputStream("resources/server.dcks"), "DoubleCA".toCharArray());// 加载密钥库

            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509", DoubleCASSE.PROVIDER_NAME);// 证书格式
            kmf.init(sm2ServerKeyStore, "DoubleCA".toCharArray());// 加载密钥储存器

            // 信任管理器
            KeyStore sm2TrustServerKeyStore = KeyStore.getInstance("DCKS");
            sm2TrustServerKeyStore.load(new FileInputStream("resources/server.dcks"), "DoubleCA".toCharArray());
            
            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", DoubleCASSE.PROVIDER_NAME);
            tmf.init(sm2TrustServerKeyStore);

            // SSL上下文设置
            SSLContext sslContext = SSLContext.getInstance("GMSSLv1.1", DoubleCASSE.PROVIDER_NAME);
            sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

            // SSLServerSocket
            SSLServerSocketFactory serverFactory = sslContext.getServerSocketFactory();
            // 端口号:34567
            SSLServerSocket svrSocket = (SSLServerSocket) serverFactory.createServerSocket(34567);
            svrSocket.setNeedClientAuth(true);//客户端模式,服务端需要验证客户端身份

            String[] supported = svrSocket.getEnabledCipherSuites();// 加密套件
            svrSocket.setEnabledCipherSuites(supported);
            System.out.println("启用的加密套件: " + Arrays.asList(supported));

            // 接收消息
            System.out.println("端口已打开,准备接受信息");

            SSLSocket cntSocket = (SSLSocket) svrSocket.accept();// 开始接收
            Certificate[] clientCerts = cntSocket.getSession().getPeerCertificates();
            System.out.println("客户端身份信息:");
            for (int i = 0; i < clientCerts.length; i++)
            {
                System.out.println(((X509Certificate)clientCerts[i]).getSubjectDN().getName());
            }
            InputStream in = cntSocket.getInputStream();// 输入流
            byte[] buffer = new byte[1024];
            int a = in.read(buffer);
            // 循环检查是否有消息到达
            System.out.println("来自于客户端:");
            while (a > 0)
            {
                System.out.print(new String(buffer).trim());
                buffer = new byte[1024];
                a = in.read(buffer);
            }
            svrSocket.close();

     

    客户端核心代码
            Security.addProvider(new DoubleCA());
            Security.addProvider(dcsse);
            // 密钥管理器
            KeyStore sm2ClientKeyStore = KeyStore.getInstance("DCKS");
            sm2ClientKeyStore.load(new FileInputStream("resources/client.dcks"), "DoubleCA".toCharArray());

            KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509", DoubleCASSE.PROVIDER_NAME);
            kmf.init(sm2ClientKeyStore, "DoubleCA".toCharArray());

            // 信任管理器
            KeyStore sm2TrustKeyStore = KeyStore.getInstance("DCKS");
            sm2TrustKeyStore.load(new FileInputStream("resources/client.dcks"), "DoubleCA".toCharArray());

            TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509", DoubleCASSE.PROVIDER_NAME);
            tmf.init(sm2TrustKeyStore);

            // SSL上下文
            SSLContext sslContext = SSLContext.getInstance("GMSSLv1.1", DoubleCASSE.PROVIDER_NAME);
            sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

            SSLSocketFactory sslcntFactory = (SSLSocketFactory) sslContext.getSocketFactory();
            // 端口号:34567
            SSLSocket sslSocket = (SSLSocket) sslcntFactory.createSocket("127.0.0.1", 34567);

            Certificate[] serverCerts = sslSocket.getSession().getPeerCertificates();
            System.out.println("服务端身份信息:");
            for (int i = 0; i < serverCerts.length; i++)
            {
                System.out.println(((X509Certificate)serverCerts[i]).getSubjectDN().getName());
            }

            String[] supported = sslSocket.getSupportedCipherSuites();
            sslSocket.setEnabledCipherSuites(supported);

            // 发送
            OutputStream out = sslSocket.getOutputStream();
            out.write("hello111111111111111111\r\n22".getBytes());
            out.flush();
            out.write("hello111111111111111112\r\n33".getBytes());
            out.flush();
            out.close();
            sslSocket.close();
            System.out.println("客户端发送完成:" + "hello");

    先执行服务端main函数,后执行客户端main函数,完成服务端-客户端的国密SSL双向通信和身份认证

     

    服务端运行结果:
    授权有效期:2999-2-20 1:01:01

     ------ http://www.DoubleCA.com ---- 大宝CA ------ 
     -------       Watchdata & DoubleCA       ------- 

    启用的加密套件: [GMSSL_ECC_WITH_SM4_CBC_SM3, GMSSL_RSA_WITH_SM4_CBC_SM3, GMSSL_RSA_WITH_SM4_CBC_SHA]
    端口已打开,准备接受信息
    客户端身份信息:
    C=CN,OU=测试,E=service@doubleca.com,CN=客户端国密SSL测试证书
    C=CN,ST=BEIJING,O=www.DoubleCA.com,CN=DoubleCA.com TEST01 CA SM2
    C=CN,ST=BEIJING,O=www.DoubleCA.com,CN=DoubleCA.com ROOT CA SM2
    来自于客户端:
    hello111111111111111111
    22hello111111111111111112
    33

     

    客户端运行结果:
    授权有效期:2999-2-20 1:01:01

     ------ http://www.DoubleCA.com ---- 大宝CA ------ 
     -------       Watchdata & DoubleCA       ------- 

    服务端身份信息:
    C=CN,OU=测试,E=service@doubleca.com,CN=服务端国密SSL测试证书
    C=CN,ST=BEIJING,O=www.DoubleCA.com,CN=DoubleCA.com TEST01 CA SM2
    C=CN,ST=BEIJING,O=www.DoubleCA.com,CN=DoubleCA.com ROOT CA SM2
    客户端发送完成:hello


    DCKS国密SSL通信证书和密钥文件在 大宝CA 网站上免费申请
    国密SSL的JAR包需要授权使用,generateLicRequest函数生成终端授权请求编码,获取到授权数据放在initLic函数中即可完成授权,申请授权数据的具体步骤:


    1. 访问PP商业软件自主授权平台

    2. 点击“应用方入口”

    3. “软件1编号”填写:66-61F74672E9534ACEAF86EEFB8D8E75D0,免费授权码数量有限,获取请联系QQ:1337588982,将授权码写在“授权码”输入框内,“终端请求授权编码”框内复制generateLicRequest函数生成的终端授权请求编码

    4. 提交授权请求后页面会生成授权数据,将授权数据复制到initLic函数中即可完成授权

    最新版本大宝CA国密SSL的JAR包和示例代码下载地址:https://download.csdn.net/download/upset_ming/11751999

    授权码保留好,如果授权数据丢失,可凭授权码在 PP商业软件自主授权平台 找回授权数据

     

    展开全文
  • 3. 调用大宝CA的JCE库 4. JDK使用无限制的安全策略文件 DCKS文件导出PEM格式数字证书的核心代码 public boolean exportCertPEM(String alias, String exportFilepath) throws KeyStoreException,...

    系统要求
    1. Windows系统、Linux系统、Mac系统
    2. JDK7及以上
    3. 调用大宝CA的JCE库
    4. JDK使用无限制的安全策略文件

     

    DCKS文件导出PEM格式数字证书的核心代码

        public boolean exportCertPEM(String alias, String exportFilepath) throws KeyStoreException, CertificateEncodingException
        {
            X509Certificate cert = (X509Certificate)this.keyStore.getCertificate(alias);
            String certBase64 = Base64.encode(cert.getEncoded());
            FileOutputStream fos = null;
            try
            {
                fos = new FileOutputStream(exportFilepath);
                byte[] certBase64Bytes = certBase64.getBytes();
                int len = certBase64Bytes.length;
                fos.write("-----BEGIN CERTIFICATE-----\r\n".getBytes());
                for (int i = 0; i < certBase64Bytes.length; i++)
                {
                    if (i > 0 && (i != len - 1) && i % 64 == 0)
                    {
                        fos.write("\r\n".getBytes());
                    }
                    fos.write(certBase64Bytes[i]);
                }
                fos.write("\r\n-----END CERTIFICATE-----".getBytes());
                return true;
            }
            catch(Exception ex)
            {
            }
            finally
            {
                try
                {
                    if (fos != null)
                    {
                        fos.close();
                    }
                }
                catch(Exception ex)
                {
                }
            }
            return false;
        }

    DCKS文件导出PEM格式SM2私钥的核心代码

        public boolean exportPrivateKeyPEM(String alias, char[] priKeyPassword, String exportFilepath)
        {
            FileOutputStream fos = null;
            try
            {
                PrivateKey sm2PrivateKey =  (PrivateKey)keyStore.getKey(alias, priKeyPassword);
                if (sm2PrivateKey == null)
                {
                    return false;
                }
                String privateBase64 = Base64.encode(sm2PrivateKey.getEncoded());
                fos = new FileOutputStream(exportFilepath);
                byte[] privateBase64Bytes = privateBase64.getBytes();
                int len = privateBase64Bytes.length;
                fos.write("-----BEGIN PRIVATE KEY-----\r\n".getBytes());
                for (int i = 0; i < len; i++)
                {
                    if (i > 0 && (i != len - 1) && i % 64 == 0)
                    {
                        fos.write("\r\n".getBytes());
                    }
                    fos.write(privateBase64Bytes[i]);
                }
                fos.write("\r\n-----END PRIVATE KEY-----".getBytes());
                return true;
            }
            catch (Exception e1)
            {
                e1.printStackTrace();
                return false;
            }
            finally
            {
                try
                {
                    if (fos != null)
                    {
                        fos.close();
                    }
                }
                catch(Exception ex)
                {
                }
            }
        }

    最新版本大宝CA国密JCE的JAR包和示例代码下载地址:https://download.csdn.net/download/upset_ming/11866671

    展开全文
  • 系统要求 Android 7.0(API 24)及以上 功能介绍 单向认证,客户端不需要国密证书和密钥 接收并显示服务器端国密数字证书 忽略服务端域名与国密证书不一致的警告 忽略不信任服务端国密根证书的警告 ...

    系统要求
    Android 7.0(API 24)及以上 

    功能介绍

    1. 单向认证,客户端不需要国密证书和密钥
    2. 接收并显示服务器端国密数字证书
    3. 忽略服务端域名与国密证书不一致的警告
    4. 忽略不信任服务端国密根证书的警告
    5. 使用PP软件授权平台获取授权数据的简要说明  

    核心代码

    /**
     *
     */
    package com.pplic.android.sample.doublecasseandroidlibproject;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import java.security.KeyManagementException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.NoSuchProviderException;
    import java.security.SecureRandom;
    import java.security.Security;
    import java.security.UnrecoverableKeyException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.TrustManagerFactory;
    import javax.net.ssl.X509TrustManager;
    
    import org.apache.commons.collections4.MapUtils;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.HttpStatus;
    import org.apache.http.HttpVersion;
    import org.apache.http.NameValuePair;
    import org.apache.http.StatusLine;
    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.client.utils.URLEncodedUtils;
    import org.apache.http.conn.ClientConnectionManager;
    import org.apache.http.conn.params.ConnManagerParams;
    import org.apache.http.conn.scheme.PlainSocketFactory;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.conn.PoolingClientConnectionManager;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.params.BasicHttpParams;
    import org.apache.http.params.CoreConnectionPNames;
    import org.apache.http.params.CoreProtocolPNames;
    import org.apache.http.params.HttpConnectionParams;
    import org.apache.http.params.HttpParams;
    import org.apache.http.params.HttpProtocolParams;
    import org.apache.http.protocol.HTTP;
    import org.apache.http.util.EntityUtils;
    
    import doubleca.security.gmssl.provider.DoubleCASSE;
    import doubleca.security.provider.DoubleCA;
    
    /**
     * @author www.DoubleCA.com
     */
    public class HttpClientUtil
    {
        private static final String ENCODING = "UTF-8";
    
        private static HttpClient client = null;
        private static SchemeRegistry schemeRegistry; // 协议控制
        private static PoolingClientConnectionManager ccm; // HttpClient连接池(多连接的线程安全的管理器)
    
        private static DoubleCASSE dcsse = null;
    
        /**
         * 用授权数据初始化dcsse
         */
        public boolean initLic(DoubleCASSE obj, String licData)
        {
            dcsse = obj;
            // 获得的本机授权数据,在https://www.PPLIC.com软件授权平台获取
            if (licData == null)
            {
                // 未授权,生成授权请求数据,与授权码一起在PP软件授权平台生成终端的授权数据,也可以请求PP软件授权平台的网络API在线申请授权数据
                StringBuffer requestDataBuffer = new StringBuffer();
                dcsse.generateLicRequest(requestDataBuffer);
                System.out.println("Android终端授权请求数据:" + requestDataBuffer.toString());
                return false;
            }
            else
            {
                dcsse.setLicData(licData);
                Date licDate = dcsse.getLicEndTime();
                if (licDate == null)
                {
                    System.out.println("非法授权数据!");
                    return false;
                }
                else
                {
                    System.out.println("授权有效期:" + dcsse.getLicEndTime().toLocaleString());
                    initClient();
                    return true;
                }
            }
        }
    
        private void initClient()
        {
            try
            {
                /*
                 * 与https请求相关的操作
                 */
                KeyStore sm2ClientKeyStore = KeyStore.getInstance("DCKS");
                sm2ClientKeyStore.load(null, null);
                SSLSocketFactory sf = new SSLSocketFactoryEx(sm2ClientKeyStore);
                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);  //允许所有主机的验证
                HttpParams httpParams = new BasicHttpParams();
                httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);// 连接超时时间(ms)
                httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, 2000);// 操作超时时间(ms)
                httpParams.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);// 设置http1.1或http1.0
                // 设置http https支持
                /*
                 * 定义访问协议
                 */
                SchemeRegistry schReg = new SchemeRegistry();
                schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
                schReg.register(new Scheme("https", sf, 443));
    
                ClientConnectionManager conManager = new ThreadSafeClientConnManager(httpParams, schReg);
                client = new DefaultHttpClient(conManager, httpParams);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
        /**
         * get请求
         *
         * @param url       请求URL
         * @param paramMap  请求参数
         * @param headerMap 请求头信息
         */
        public String get(String url, Map<String, String> paramMap, Map<String, String> headerMap) throws ClientProtocolException, IOException
        {
            /*
             * 拼接URL与参数
             */
            if (MapUtils.isNotEmpty(paramMap))
            {
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                for (String key : paramMap.keySet())
                {
                    params.add(new BasicNameValuePair(key, paramMap.get(key)));
                }
                String queryString = URLEncodedUtils.format(params, ENCODING);
                if (url.indexOf("?") > -1)
                {// 存在?,表示这时的URL已经带参数了
                    url += "&" + queryString;
                }
                else
                {
                    url += "?" + queryString;
                }
            }
    
            HttpGet httpGet = new HttpGet(url);
    
            /*
             * 设置头信息
             */
            if (MapUtils.isNotEmpty(headerMap))
            {
                Set<String> keySet = headerMap.keySet();
                for (String key : keySet)
                {
                    httpGet.addHeader(key, headerMap.get(key));
                }
            }
    
            String result = "";
    
            HttpResponse response = client.execute(httpGet); // 发出get请求
            StatusLine status = response.getStatusLine(); // 获取返回的状态码
            HttpEntity entity = response.getEntity(); // 获取返回的响应内容
            if (status.getStatusCode() == HttpStatus.SC_OK)
            { // 200
                result = EntityUtils.toString(entity, ENCODING);
            }
    
            httpGet.abort();// 中止请求,连接被释放回连接池
            return result;
        }
    
        /**
         * post请求
         *
         * @param url       //请求URL
         * @param paramMap  //请求参数
         * @param headerMap //请求头信息
         */
        public String post(String url, Map<String, String> paramMap, Map<String, String> headerMap) throws ClientProtocolException, IOException
        {
            HttpPost httpPost = new HttpPost(url);
            /*
             * 处理参数
             */
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            if (MapUtils.isNotEmpty(paramMap))
            {
                Set<String> keySet = paramMap.keySet();
                for (String key : keySet)
                {
                    params.add(new BasicNameValuePair(key, paramMap.get(key)));
                }
            }
            /*
             * 设置头信息
             */
            if (MapUtils.isNotEmpty(headerMap))
            {
                Set<String> keySet = headerMap.keySet();
                for (String key : keySet)
                {
                    httpPost.addHeader(key, headerMap.get(key));
                }
            }
    
            String result = "";
    
            httpPost.setEntity(new UrlEncodedFormEntity(params, ENCODING));// 设置参数
            HttpResponse response = client.execute(httpPost); // 发出post请求
            StatusLine status = response.getStatusLine(); // 获取返回的状态码
            HttpEntity entity = response.getEntity(); // 获取响应内容
            if (status.getStatusCode() == HttpStatus.SC_OK)
            {
                result = EntityUtils.toString(entity, ENCODING);
            }
    
            httpPost.abort();// 中止请求,连接被释放回连接池
            return result;
        }
    
        class SSLSocketFactoryEx extends SSLSocketFactory
        {
            SSLContext sslContext = null;
    
            public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException, NoSuchProviderException
            {
                super(truststore);
                sslContext = SSLContext.getInstance("GMSSLv1.1", DoubleCASSE.PROVIDER_NAME);
                TrustManager tm = new X509TrustManager()
                {
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers()
                    {
                        return null;
                    }
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException
                    {
                    }
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws java.security.cert.CertificateException
                    {
                        System.out.println("服务端国密证书信息:");
                        for (int i = 0; i < chain.length; i++)
                        {
                            System.out.println(chain[i].getSubjectDN().getName());
                        }
                    }
                };
                sslContext.init(null, new TrustManager[]{tm}, null);
            }
    
            @Override
            public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException
            {
                return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
            }
    
            @Override
            public Socket createSocket() throws IOException
            {
                return sslContext.getSocketFactory().createSocket();
            }
        }
    }
    

    Android平台运行结果

    国密数字证书

    DCKS国密SSL通信证书和密钥文件在 大宝 CAhttps://www.DoubleCA.com 网站上免费申请

     

    学习交流与商业授权

    Android版本国密SSL协议密码套件的商业应用需要大宝CA的授权许可,有如下两种方式进行授权:

    1. 离线授权,通过访问PP商业软件自主授权平台:https://www.PPLIC.com,在页面上进行人工授权
    2. 在线授权,通过调用PP商业软件自主授权平台的网络授权服务API函数可自动获取Android终端的授权数据

     

    库文件和示例代码的下载

    Android平台通过HttpClient调用大宝CA国密SSL密码套件访问国密HTTPS安全服务示例代码的下载地址:https://download.csdn.net/download/upset_ming/12194460

    展开全文
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/94435288 1. 修改了以前版本中的一些BUG 2. 可以适配360、密信、海泰等国密浏览器 3. 支持国密SSL双向认证
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/89048916 1. 支持国密SSL单向认证和双向认证 2. 获取服务端的国密数字证书 3. 适用于Android 7.0(API 24)及以上
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/100770417 1. Android使用... 2. 示例代码为单向认证,可支持双向认证 3. 获取服务端的国密数字证书 4. 适用于Android 7.0(API 24)及以上
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/94435648 1. 修改了以前版本中的一些BUG 2. 可以适配360、密信、海泰等国密浏览器 3. 支持国密SSL双向认证
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/96490132 1. 修改了以前版本中的一些BUG 2. 可以适配360、密信、海泰等国密浏览器 3. 支持国密SSL双向认证
  • 3. 调用大宝CA的JCE库 4. JDK使用无限制的安全策略文件 PEM证书和私钥导入DCKS文件的核心代码 public String importCertAndPrivateKeyPEM(String sm2PublicKeyPEMFilepath, String sm2PrivateKe...

    系统要求
    1. Windows系统、Linux系统、Mac系统
    2. JDK7及以上
    3. 调用大宝CA的JCE库
    4. JDK使用无限制的安全策略文件

     

    PEM证书和私钥导入DCKS文件的核心代码

        public String importCertAndPrivateKeyPEM(String sm2PublicKeyPEMFilepath, String sm2PrivateKeyPEMFilepath, char[] priKeyPassword, String alias)
        {
            InputStream bis1 = null;
            InputStream bis2 = null;
            X509Certificate cert = null;
            try
            {
                bis1 = new FileInputStream(new File(sm2PublicKeyPEMFilepath));
                CertificateFactory cf = CertificateFactory.getInstance("X509", DoubleCA.PROVIDER_NAME);
                cert = (X509Certificate)cf.generateCertificate(bis1);
                if (alias == null)
                {
                    alias = DnComponents.stringToBCDNString(((X509Certificate)cert).getSubjectDN().getName());
                }
                PublicKey sm2PublicKey = cert.getPublicKey();
                
                bis2 = new FileInputStream(new File(sm2PrivateKeyPEMFilepath));
                int bufferLen = bis2.available();
                byte[] bufferTemp = new byte[bufferLen];
                bis2.read(bufferTemp);
                String strtemp = new String(bufferTemp);
                strtemp = strtemp.replaceAll("-----BEGIN PRIVATE KEY-----", "");
                strtemp = strtemp.replaceAll("-----END PRIVATE KEY-----", "");
                byte[] privateKeyBytes = Base64.decode(strtemp);
                PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);

                KeyFactory factory = KeyFactory.getInstance("SM2");
                PrivateKey sm2PrivateKey = factory.generatePrivate(pkcs8EncodedKeySpec);
                KeyPair keyPair = new KeyPair(sm2PublicKey, sm2PrivateKey);
                X509Certificate[] chain = new X509Certificate[1];
                chain[0] = cert;
                if (alias == null || alias.length() <= 0)
                {
                    alias = DnComponents.stringToBCDNString(chain[0].getSubjectDN().getName());
                }
                keyStore.setKeyEntry(alias, keyPair.getPrivate(), priKeyPassword, chain);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
                alias = null;
            }
            finally
            {
                try
                {
                    bis1.close();
                }
                catch(Exception ex)
                {
                }
                try
                {
                    bis2.close();
                }
                catch(Exception ex)
                {
                }
            }
            return alias;
        }

    最新版本大宝CA国密JCE的JAR包和示例代码下载地址:https://download.csdn.net/download/upset_ming/11866671

    展开全文
  • 系统要求 1. Windows系统、Linux系统、Mac系统 2. JDK7及以上3. JDK使用无限制的安全策略文件 TcpGmSslClient.java代码 /** *@author https://www.doubleca.com */ package ...import java.io.IO...
  • // 模拟器授权数据,每部手机的授权数据不同,请向大宝CA销售人员【QQ:1337588982】索取【国密SSL密码套件】的授权码或批量授权码 String licData = "AdZeAkVxs7NYwAABC1I9LrCu48kTTA8gL2/iGnR72qL2RK93B2...
  • 系统要求 1. Windows系统、Linux系统、Mac系统 2. JDK7及以上 3. JDK使用无限制的安全策略文件 HttpClient客户端核心代码 import java.io.FileInputStream;...import java.io.FileNotFoundException;...
  • 系统要求 1. Windows系统、Linux系统、Mac系统 2. JDK7及以上 3. JDK使用无限制的安全策略文件 TcpGmSslServer.java代码 /** *@author https://www.doubleca.com */ package ...import java.io.I...
  • 系统要求 Android 5.0(API 21)及以上 功能介绍 SM2密钥对的生成功能 ... 大宝CA版本Keystore文件(DCKS文件)存储SM2密钥对和国密数字证书的功能 Android调用JCE的主要代码 package com.doubl...
  • 大宝CA完整地实现了国密SM2、SM3、SM4算法和JKS功能,可加密、解密、数字签名、验证、摘要计算,可存储和应用SM2软证书和软密钥。可惜没有源码,只有详细的测试和应用样例代码。
  • 密钥生成算法 SM2密钥对生成算法的实现 SM4密钥生成算法的实现 加解密算法 SM2非对称加解密算法的实现 SM4对称加解密算法的实现,支持ECB、CBC及NOPADDING和PKCS5PADDING填充算法 数字签名算法 ...
  • 文中所有内容通过本机运行,没有详细的原理介绍,原理介绍网上很多。
  • 1. 解压缩ZIP文件,安装国密浏览器(只能安装此版本,其它版本不能信任指定根证书,无法使用) 2. 将ctl.dat文件复制到此目录下:C:\Users\自己的账户名...感谢大宝CA(http://www.DoubleCA.com)的国密SM2数字证书支持
  • 参照示例代码将相应的终端开发包接入自己的程序之中,只有2个函数 特别说明:需要对终端开发包的JAR文件检查数字签名,防止JAR包被替换,这里对大宝CA表示感谢,感谢大宝CA免费提供的JAR包代码签名证书。...
  • 1、大宝CA doubleCAhttps://doubleca.com/test_toIndexPage.action 2、国密服务器开发https://github.com/mrpre/atls 3. TLS/SSL 协议详解 (29) 国密SSL协议(代码见参考文献2)...
  • This paper presents a new building of CAI system which is computer suppoR corporative learning(CSCL).Based on(cscw),and instructed by"CA/system of information technology'’,this new building of ...
  • 国密SSL协议在GM/T 0024-2014规范中定义 1. 下载并安装支持国密SSL...多说一句,需要各类RSA代码签名证书、SSL证书、智能卡域登录证书、邮件保护证书、SM2证书的朋友可以在大宝CA数字证书平台免费申请和下载 3....
  • DoubleCA数字证书的样例代码,可实现SM2数字证书的PKCS10证书请求,PKCS12带私钥的数字证书格式,和P7B证书链。

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

大宝CA