• https p12证书请求解决问题过程


    1.“No subject alternative names present” 异常解决

    访问https,报javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present

    是对域名的不信任造成的

    增加代码

     1 static {  
     2      javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(  
     3      new javax.net.ssl.HostnameVerifier(){  
     4           public boolean verify(String hostname,javax.net.ssl.SSLSession sslSession) {  
     5                 if (hostname.equals("localhost")) {  // for localhost testing
     6                      return true;  
     7                 }else  if (hostname.equals(host)) {  //实际请求地址 host
     8                      return true;  
     9                 }  
    10                 return false;  
    11           }  
    12      });  
    13 }  

    2.数据请求代码

    public static JSONObject httpsRequest(String requestUrl, String requestMethod, String params) {
            JSONObject jsonObject = null;
            StringBuffer buffer = new StringBuffer();
            try {
                KeyStore clientStore = KeyStore.getInstance("PKCS12");
                String keyStorePassword = "cert password";
                clientStore.load(WoJiaHttpsRequest.class.getResourceAsStream("/cert.p12"), keyStorePassword.toCharArray());
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                kmf.init(clientStore,keyStorePassword.toCharArray());
                KeyManager[] kms = kmf.getKeyManagers();
                KeyStore trustStore = KeyStore.getInstance("JKS");
                trustStore.load(WoJiaHttpsRequest.class.getResourceAsStream("/jssecacerts"),"changeit".toCharArray());//信任域名证书jssecacerts
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                tmf.init(trustStore);
                TrustManager[] tms = tmf.getTrustManagers();
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(kms,tms, new SecureRandom());
                SSLSocketFactory ssf = sslContext.getSocketFactory();
            // 从上述SSLContext对象中得到SSLSocketFactory对象
                URL url = new URL(requestUrl);
                HttpsURLConnection httpUrlConn = (javax.net.ssl.HttpsURLConnection) url.openConnection();
                try{
                    httpUrlConn.setSSLSocketFactory(ssf);
                    httpUrlConn.setDoOutput(true);  
                    httpUrlConn.setDoInput(true);  
                    httpUrlConn.setRequestMethod(requestMethod);  
                    httpUrlConn.setUseCaches(false);  
                    httpUrlConn.setInstanceFollowRedirects(true);  
                    httpUrlConn.setRequestProperty("Content-Type", "application/json");  
                    httpUrlConn.setRequestProperty("Accept", "application/json");  
                    httpUrlConn.setConnectTimeout(2000);
                    httpUrlConn.setReadTimeout(3000);
                    httpUrlConn.connect();  
                    // 当有数据需要提交时
                    if (null != params) {
                        OutputStream outputStream = new DataOutputStream(  
                                httpUrlConn.getOutputStream());
                        // 注意编码格式,防止中文乱码   
                        outputStream.write(params.getBytes("UTF-8"));
                        outputStream.flush();
                        outputStream.close();
                    }
                    // 将返回的输入流转换成字符串
                    InputStream inputStream = httpUrlConn.getInputStream();
                    InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                    String str = null;  
                    while ((str = bufferedReader.readLine()) != null) {
                        buffer.append(str);
                    }
                    bufferedReader.close();
                    inputStreamReader.close();
                    // 释放资源   
                    inputStream.close();
                    inputStream = null;
                    jsonObject = JSONObject.fromObject(buffer.toString());
                }catch(Exception e){
                        logger.error("http request error:{}", e);
                }finally{
                        if(httpUrlConn != null) httpUrlConn.disconnect();
                }
            } catch (ConnectException ce) {
                logger.error("server connection timed out.");
            } catch (Exception e) {
                logger.error("https request error:{}", e);
            }
            return jsonObject;
        }

    3.jssecacerts的生成方法

    编译:javac InstallCert.java    运行:java InstallCert 172.0.0.1 //域名地址,如果有端口要带端口

    4.InstallCert.java 代码

    /*
     * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *   - Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     *   - Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     *   - Neither the name of Sun Microsystems nor the names of its
     *     contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
     * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
     
    import java.io.*;
    import java.net.URL;
     
    import java.security.*;
    import java.security.cert.*;
     
    import javax.net.ssl.*;
     
    public class InstallCert {
     
        public static void main(String[] args) throws Exception {
        String host;
        int port;
        char[] passphrase;
        if ((args.length == 1) || (args.length == 2)) {
            String[] c = args[0].split(":");
            host = c[0];
            port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
            String p = (args.length == 1) ? "changeit" : args[1];
            passphrase = p.toCharArray();
        } else {
            System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
            return;
        }
     
        File file = new File("jssecacerts");
        if (file.isFile() == false) {
            char SEP = File.separatorChar;
            File dir = new File(System.getProperty("java.home") + SEP
                + "lib" + SEP + "security");
            file = new File(dir, "jssecacerts");
            if (file.isFile() == false) {
            file = new File(dir, "cacerts");
            }
        }
        System.out.println("Loading KeyStore " + file + "...");
        InputStream in = new FileInputStream(file);
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(in, passphrase);
        in.close();
     
        SSLContext context = SSLContext.getInstance("TLS");
        TrustManagerFactory tmf =
            TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
        SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
        context.init(null, new TrustManager[] {tm}, null);
        SSLSocketFactory factory = context.getSocketFactory();
     
        System.out.println("Opening connection to " + host + ":" + port + "...");
        SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
        socket.setSoTimeout(10000);
        try {
            System.out.println("Starting SSL handshake...");
            socket.startHandshake();
            socket.close();
            System.out.println();
            System.out.println("No errors, certificate is already trusted");
        } catch (SSLException e) {
            System.out.println();
            e.printStackTrace(System.out);
        }
     
        X509Certificate[] chain = tm.chain;
        if (chain == null) {
            System.out.println("Could not obtain server certificate chain");
            return;
        }
     
        BufferedReader reader =
            new BufferedReader(new InputStreamReader(System.in));
     
        System.out.println();
        System.out.println("Server sent " + chain.length + " certificate(s):");
        System.out.println();
        MessageDigest sha1 = MessageDigest.getInstance("SHA1");
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        for (int i = 0; i < chain.length; i++) {
            X509Certificate cert = chain[i];
            System.out.println
                (" " + (i + 1) + " Subject " + cert.getSubjectDN());
            System.out.println("   Issuer  " + cert.getIssuerDN());
            sha1.update(cert.getEncoded());
            System.out.println("   sha1    " + toHexString(sha1.digest()));
            md5.update(cert.getEncoded());
            System.out.println("   md5     " + toHexString(md5.digest()));
            System.out.println();
        }
     
        System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
        String line = reader.readLine().trim();
        int k;
        try {
            k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
        } catch (NumberFormatException e) {
            System.out.println("KeyStore not changed");
            return;
        }
     
        X509Certificate cert = chain[k];
        String alias = host + "-" + (k + 1);
        ks.setCertificateEntry(alias, cert);
     
        OutputStream out = new FileOutputStream("jssecacerts");
        ks.store(out, passphrase);
        out.close();
     
        System.out.println();
        System.out.println(cert);
        System.out.println();
        System.out.println
            ("Added certificate to keystore 'jssecacerts' using alias '"
            + alias + "'");
        }
     
        private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();
     
        private static String toHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 3);
        for (int b : bytes) {
            b &= 0xff;
            sb.append(HEXDIGITS[b >> 4]);
            sb.append(HEXDIGITS[b & 15]);
            sb.append(' ');
        }
        return sb.toString();
        }
     
        private static class SavingTrustManager implements X509TrustManager {
     
        private final X509TrustManager tm;
        private X509Certificate[] chain;
     
        SavingTrustManager(X509TrustManager tm) {
            this.tm = tm;
        }
     
        public X509Certificate[] getAcceptedIssuers() {
            throw new UnsupportedOperationException();
        }
     
        public void checkClientTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
            throw new UnsupportedOperationException();
        }
     
        public void checkServerTrusted(X509Certificate[] chain, String authType)
            throws CertificateException {
            this.chain = chain;
            tm.checkServerTrusted(chain, authType);
        }
        }
     
    }
  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/cyanqx/p/6640693.html
Copyright © 2020-2023  润新知