Java HTTPS客户端如何处理证书

2023-11-12


HTTPS(HTTP over Secure Socket Layer),简单讲即HTTP下加入SSL层,HTTPS的安全基础是SSL。


参考以前的两篇文章
Java-JSSE-SSL/TLS编程代码实例-单向认证 
Java-JSSE-SSL/TLS编程代码实例-双向认证 
如果要实现SSL通讯,通讯双方需要设置KeyStore和TrustStore。
如果是单向认证,那么client侧只需要设置TrustStore, 客户端的TrustStore文件中保存着被客户端所信任的服务器的证书信息。

客户端在进行SSL连接时,JSSE将根据这个文件中的证书决定是否信任服务器端的证书。


但是通常我们并不需要做这个就能正常访问HTTPS服务。比如利用Spring中的RestTemplate访问微信的获取AccessToken的API接口。
    @Test
    public void testRestTemplate() throws Exception {
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=1&secret=2";
        RestTemplate restTemplate = new RestTemplate();
        String resultJasonStr = restTemplate.getForObject(url, String.class);
        System.out.println(resultJasonStr);
    }


运行成功,我们可以看到打印出来的返回结果,因为我们用的appid和secret都是错误的,所以会得到40001错误。
{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest hint: [v_xuha0307vr18]"}


如果不用Spring,也可以直接使用Java的java.net.URLConnection,会得到同样的结果
    @Test
    public void testHttpUrlConnection() throws IOException, URISyntaxException {
        URL url = new URL("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=1&secret=2");


        URLConnection con = url.openConnection();
        con.connect();
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"));
        String s;
        while ((s = reader.readLine()) != null) {
            System.out.println(s);
        }
        reader.close();
    }


为什么不需要设置TrustStore,HTTPS客户端就能正常工作呢?
首先要说明,TrustStore文件中也可以不保存服务器的证书信息,如果服务器的证书是经过CA签名的,那么只要保存着CA的根证书即可。
在SunJSSE中,有一个信任管理器类负责决定是否信任远端的证书,这个类有如下的处理规则:
1)若系统属性javax.net.ssl.trustStore指定了TrustStore文件,那么信任管理器就去jre安装路径下的lib/security/目录中寻找并使用这个文件来检查证书。
2)若该系统属性没有指定TrustStore文件,它就会去JRE安装路径下寻找默认的TrustStore文件,这个文件的相对路径为:lib/security/jssecacerts。
3)若jssecacerts不存在,但是cacerts存在(它随JRE一起发行,含有数量有限的可信任的基本证书),那么这个默认的TrustStore文件就是lib/security/cacerts。
按照这个规则,我们猜测,在JRE的jssecacerts或者是cacerts保存着微信API服务器证书的CA证书。


本机所使用的JDK1.8的jre/lib/security/下面找到了cacerts文件,
首先查看一下里面的证书。访问TrustStore文件需要store password, 默认的password是changeit.
C:\Program Files\Java\jdk1.8.0_45\jre\lib\security>keytool -list  -keystore cacerts -storepass changeit


密钥库类型: JKS
密钥库提供方: SUN


您的密钥库包含 92 个条目


digicertassuredidrootca, 2008-4-16, trustedCertEntry,
证书指纹 (SHA1): 05:63:B8:63:0D:62:D7:5A:BB:C8:AB:1E:4B:DF:B5:A8:99:B2:4D:43
trustcenterclass2caii, 2008-4-29, trustedCertEntry,
证书指纹 (SHA1): AE:50:83:ED:7C:F4:5C:BC:8F:61:C6:21:FE:68:5D:79:42:21:15:6E
thawtepremiumserverca, 2009-12-12, trustedCertEntry,
证书指纹 (SHA1): E0:AB:05:94:20:72:54:93:05:60:62:02:36:70:F7:CD:2E:FC:66:66
swisssignplatinumg2ca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): 56:E0:FA:C0:3B:8F:18:23:55:18:E5:D3:11:CA:E8:C2:43:31:AB:66
swisssignsilverg2ca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): 9B:AA:E5:9F:56:EE:21:CB:43:5A:BE:25:93:DF:A7:F0:40:D1:1D:CB
thawteserverca, 2009-12-12, trustedCertEntry,
证书指纹 (SHA1): 9F:AD:91:A6:CE:6A:C6:C5:00:47:C4:4E:C9:D4:A5:0D:92:D8:49:79
equifaxsecureebusinessca1, 2014-11-12, trustedCertEntry,
证书指纹 (SHA1): AE:E6:3D:70:E3:76:FB:C7:3A:EB:B0:A1:C1:D4:C4:7A:A7:40:B3:F4
securetrustca, 2014-3-6, trustedCertEntry,
证书指纹 (SHA1): 87:82:C6:C3:04:35:3B:CF:D2:96:92:D2:59:3E:7D:44:D9:34:FF:11
utnuserfirstclientauthemailca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): B1:72:B1:A5:6D:95:F9:1F:E5:02:87:E1:4D:37:EA:6A:44:63:76:8A
thawtepersonalfreemailca, 2009-12-12, trustedCertEntry,
证书指纹 (SHA1): E6:18:83:AE:84:CA:C1:C1:CD:52:AD:E8:E9:25:2B:45:A6:4F:B7:E2
affirmtrustnetworkingca, 2014-4-15, trustedCertEntry,
证书指纹 (SHA1): 29:36:21:02:8B:20:ED:02:F5:66:C5:32:D1:D6:ED:90:9F:45:00:2F
entrustevca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): B3:1E:B1:B7:40:E3:6C:84:02:DA:DC:37:D4:4D:F5:D4:67:49:52:F9
utnuserfirsthardwareca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): 04:83:ED:33:99:AC:36:08:05:87:22:ED:BC:5E:46:00:E3:BE:F9:D7
certumca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 62:52:DC:40:F7:11:43:A2:2F:DE:9E:F7:34:8E:06:42:51:B1:81:18
addtrustclass1ca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): CC:AB:0E:A0:4C:23:01:D6:69:7B:DD:37:9F:CD:12:EB:24:E3:94:9D
entrustrootcag2, 2010-6-23, trustedCertEntry,
证书指纹 (SHA1): 8C:F4:27:FD:79:0C:3A:D1:66:06:8D:E8:1E:57:EF:BB:93:22:72:D4
equifaxsecureca, 2003-7-19, trustedCertEntry,
证书指纹 (SHA1): D2:32:09:AD:23:D3:14:23:21:74:E4:0D:7F:9D:62:13:97:86:63:3A
quovadisrootca3, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 1F:49:14:F7:D8:74:95:1D:DD:AE:02:C0:BE:FD:3A:2D:82:75:51:85
quovadisrootca2, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): CA:3A:FB:CF:12:40:36:4B:44:B2:16:20:88:80:48:39:19:93:7C:F7
swisscomrootca2, 2015-1-16, trustedCertEntry,
证书指纹 (SHA1): 77:47:4F:C6:30:E4:0F:4C:47:64:3F:84:BA:B8:C6:95:4A:8A:41:EC
digicerthighassuranceevrootca, 2008-4-16, trustedCertEntry,
证书指纹 (SHA1): 5F:B7:EE:06:33:E2:59:DB:AD:0C:4C:9A:E6:D3:8F:1A:61:C7:DC:25
secomvalicertclass1ca, 2008-6-3, trustedCertEntry,
证书指纹 (SHA1): E5:DF:74:3C:B6:01:C4:9B:98:43:DC:AB:8C:E8:6A:81:10:9F:E4:8E
equifaxsecureglobalebusinessca1, 2014-11-12, trustedCertEntry,
证书指纹 (SHA1): 3A:74:CB:7A:47:DB:70:DE:89:1F:24:35:98:64:B8:2D:82:BD:1A:36
geotrustuniversalca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): E6:21:F3:35:43:79:05:9A:4B:68:30:9D:8A:2F:74:22:15:87:EC:79
verisignclass3ca, 2009-12-12, trustedCertEntry,
证书指纹 (SHA1): A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B
thawteprimaryrootcag3, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): F1:8B:53:8D:1B:E9:03:B6:A6:F0:56:43:5B:17:15:89:CA:F3:6B:F2
thawteprimaryrootcag2, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): AA:DB:BC:22:23:8F:C4:01:A1:27:BB:38:DD:F4:1D:DB:08:9E:F0:12
deutschetelekomrootca2, 2008-11-15, trustedCertEntry,
证书指纹 (SHA1): 85:A4:08:C0:9C:19:3E:5D:51:58:7D:CD:D6:13:30:FD:8C:DE:37:BF
buypassclass3ca, 2014-1-7, trustedCertEntry,
证书指纹 (SHA1): DA:FA:F7:FA:66:84:EC:06:8F:14:50:BD:C7:C2:81:A5:BC:A9:64:57
utnuserfirstobjectca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): E1:2D:FB:4B:41:D7:D9:C3:2B:30:51:4B:AC:1D:81:D8:38:5E:2D:46
geotrustprimaryca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 32:3C:11:8E:1B:F7:B8:B6:52:54:E2:E2:10:0D:D6:02:90:37:F0:96
buypassclass2ca, 2014-1-7, trustedCertEntry,
证书指纹 (SHA1): 49:0A:75:74:DE:87:0A:47:FE:58:EE:F6:C7:6B:EB:C6:0B:12:40:99
baltimorecodesigningca, 2002-5-10, trustedCertEntry,
证书指纹 (SHA1): 30:46:D8:C8:88:FF:69:30:C3:4A:FC:CD:49:27:08:7C:60:56:7B:0D
verisignclass1ca, 2009-12-12, trustedCertEntry,
证书指纹 (SHA1): CE:6A:64:A3:09:E4:2F:BB:D9:85:1C:45:3E:64:09:EA:E8:7D:60:F1
baltimorecybertrustca, 2002-5-10, trustedCertEntry,
证书指纹 (SHA1): D4:DE:20:D0:5E:66:FC:53:FE:1A:50:88:2C:78:DB:28:52:CA:E4:74
starfieldclass2ca, 2005-1-20, trustedCertEntry,
证书指纹 (SHA1): AD:7E:1C:28:B0:64:EF:8F:60:03:40:20:14:C3:D0:E3:37:0E:B5:8A
camerfirmachamberscommerceca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1
ttelesecglobalrootclass3ca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 55:A6:72:3E:CB:F2:EC:CD:C3:23:74:70:19:9D:2A:BE:11:E3:81:D1
verisignclass3g5ca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5
ttelesecglobalrootclass2ca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 59:0D:2D:7D:88:4F:40:2E:61:7E:A5:62:32:17:65:CF:17:D8:94:E9
trustcenteruniversalcai, 2008-4-29, trustedCertEntry,
证书指纹 (SHA1): 6B:2F:34:AD:89:58:BE:62:FD:B0:6B:5C:CE:BB:9D:D9:4F:4E:39:F3
verisignclass3g4ca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 22:D5:D8:DF:8F:02:31:D1:8D:F7:9D:B7:CF:8A:2D:64:C9:3F:6C:3A
verisignclass3g3ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): 13:2D:0D:45:53:4B:69:97:CD:B2:D5:C3:39:E2:55:76:60:9B:5C:C6
xrampglobalca, 2014-3-6, trustedCertEntry,
证书指纹 (SHA1): B8:01:86:D1:EB:9C:86:A5:41:04:CF:30:54:F3:4C:52:B7:E5:58:C6
certplusclass3pprimaryca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 21:6B:2A:29:E6:2A:00:CE:82:01:46:D8:24:41:41:B9:25:11:B2:79
certumtrustednetworkca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 07:E0:32:E0:20:B7:2C:3F:19:2F:06:28:A2:59:3A:19:A7:0F:06:9E
verisignclass3g2ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): 85:37:1C:A6:E5:50:14:3D:CE:28:03:47:1B:DE:3A:09:E8:F8:77:0F
globalsignr3ca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): D6:9B:56:11:48:F0:1C:77:C5:45:78:C1:09:26:DF:5B:85:69:76:AD
utndatacorpsgcca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): 58:11:9F:0E:12:82:87:EA:50:FD:D9:87:45:6F:4F:78:DC:FA:D6:D4
secomscrootca2, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 5F:3B:8C:F2:F8:10:B3:7D:78:B4:CE:EC:19:19:C3:73:34:B9:C7:74
gtecybertrustglobalca, 2002-5-10, trustedCertEntry,
证书指纹 (SHA1): 97:81:79:50:D8:1C:96:70:CC:34:D8:09:CF:79:44:31:36:7E:F4:74
secomscrootca1, 2008-6-3, trustedCertEntry,
证书指纹 (SHA1): 36:B1:2B:49:F9:81:9E:D7:4C:9E:BC:38:0F:C6:56:8F:5D:AC:B2:F7
affirmtrustcommercialca, 2014-4-15, trustedCertEntry,
证书指纹 (SHA1): F9:B5:B6:32:45:5F:9C:BE:EC:57:5F:80:DC:E9:6E:2C:C7:B2:78:B7
trustcenterclass4caii, 2008-4-29, trustedCertEntry,
证书指纹 (SHA1): A6:9A:91:FD:05:7F:13:6A:42:63:0B:B1:76:0D:2D:51:12:0C:16:50
verisignuniversalrootca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 36:79:CA:35:66:87:72:30:4D:30:A5:FB:87:3B:0F:A7:7B:B7:0D:54
globalsignr2ca, 2007-8-3, trustedCertEntry,
证书指纹 (SHA1): 75:E0:AB:B6:13:85:12:27:1C:04:F8:5F:DD:DE:38:E4:B7:24:2E:FE
certplusclass2primaryca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 74:20:74:41:72:9C:DD:92:EC:79:31:D8:23:10:8D:C2:81:92:E2:BB
digicertglobalrootca, 2008-4-16, trustedCertEntry,
证书指纹 (SHA1): A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
globalsignca, 2008-3-19, trustedCertEntry,
证书指纹 (SHA1): B1:BC:96:8B:D4:F4:9D:62:2A:A8:9A:81:F2:15:01:52:A4:1D:82:9C
thawteprimaryrootca, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 91:C6:D6:EE:3E:8A:C8:63:84:E5:48:C2:99:29:5C:75:6C:81:7B:81
starfieldrootg2ca, 2014-7-19, trustedCertEntry,
证书指纹 (SHA1): B5:1C:06:7C:EE:2B:0C:3D:F8:55:AB:2D:92:F4:FE:39:D4:E7:0F:0E
geotrustglobalca, 2003-7-19, trustedCertEntry,
证书指纹 (SHA1): DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12
soneraclass2ca, 2006-3-29, trustedCertEntry,
证书指纹 (SHA1): 37:F7:6D:E6:07:7C:90:C5:B1:3E:93:1A:B7:41:10:B4:F2:E4:9A:27
swisscomrootevca2, 2015-1-16, trustedCertEntry,
证书指纹 (SHA1): E7:A1:90:29:D3:D5:52:DC:0D:0F:C6:92:D3:EA:88:0D:15:2E:1A:6B
verisigntsaca, 2014-11-12, trustedCertEntry,
证书指纹 (SHA1): 20:CE:B1:F0:F5:1C:0E:19:A9:F3:8D:B1:AA:8E:03:8C:AA:7A:C7:01
soneraclass1ca, 2006-3-29, trustedCertEntry,
证书指纹 (SHA1): 07:47:22:01:99:CE:74:B9:7C:B0:3D:79:B2:64:A2:C8:55:E9:33:FF
quovadisrootca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): DE:3F:40:BD:50:93:D3:9B:6C:60:F6:DA:BC:07:62:01:00:89:76:C9
affirmtrustpremiumeccca, 2014-4-15, trustedCertEntry,
证书指纹 (SHA1): B8:23:6B:00:2F:1D:16:86:53:01:55:6C:11:A4:37:CA:EB:FF:C3:BB
starfieldservicesrootg2ca, 2014-7-19, trustedCertEntry,
证书指纹 (SHA1): 92:5A:8F:8D:2C:6D:04:E0:66:5F:59:6A:FF:22:D8:63:E8:25:6F:3F
valicertclass2ca, 2005-1-20, trustedCertEntry,
证书指纹 (SHA1): 31:7A:2A:D0:7F:2B:33:5E:F5:A1:C3:4E:4B:57:E8:B7:D8:F1:FC:A6
comodoaaaca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): D1:EB:23:A4:6D:17:D6:8F:D9:25:64:C2:F1:F1:60:17:64:D8:E3:49
addtrustqualifiedca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): 4D:23:78:EC:91:95:39:B5:00:7F:75:8F:03:3B:21:1E:C5:4D:8B:CF
keynectisrootca, 2010-4-24, trustedCertEntry,
证书指纹 (SHA1): 9C:61:5C:4D:4D:85:10:3A:53:26:C2:4D:BA:EA:E4:A2:D2:D5:CC:97
aolrootca2, 2008-3-19, trustedCertEntry,
证书指纹 (SHA1): 85:B5:FF:67:9B:0C:79:96:1F:C8:6E:44:22:00:46:13:DB:17:92:84
addtrustexternalca, 2006-5-2, trustedCertEntry,
证书指纹 (SHA1): 02:FA:F3:E2:91:43:54:68:60:78:57:69:4D:F5:E4:5B:68:85:18:68
verisignclass2g3ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): 61:EF:43:D7:7F:CA:D4:61:51:BC:98:E0:C3:59:12:AF:9F:EB:63:11
aolrootca1, 2008-3-19, trustedCertEntry,
证书指纹 (SHA1): 39:21:C1:15:C1:5D:0E:CA:5C:CB:5B:C4:F0:7D:21:D8:05:0B:56:6A
luxtrustglobalrootca, 2015-1-16, trustedCertEntry,
证书指纹 (SHA1): C9:3C:34:EA:90:D9:13:0C:0F:03:00:4B:98:BD:8B:35:70:91:56:11
verisignclass2g2ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D
geotrustprimarycag3, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 03:9E:ED:B8:0B:E7:A0:3C:69:53:89:3B:20:D2:D9:32:3A:4C:2A:FD
geotrustprimarycag2, 2009-12-11, trustedCertEntry,
证书指纹 (SHA1): 8D:17:84:D5:37:F3:03:7D:EC:70:FE:57:8B:51:9A:99:E6:10:D7:B0
swisssigngoldg2ca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): D8:C5:38:8A:B7:30:1B:1B:6E:D4:7A:E6:45:25:3A:6F:9F:1A:27:61
entrust2048ca, 2010-6-23, trustedCertEntry,
证书指纹 (SHA1): 50:30:06:09:1D:97:D4:F5:AE:39:F7:CB:E7:92:7D:7D:65:2D:34:31
chunghwaepkirootca, 2014-1-14, trustedCertEntry,
证书指纹 (SHA1): 67:65:0D:F1:7E:8E:7E:5B:82:40:A4:F4:56:4B:CF:E2:3D:69:C6:F0
camerfirmachambersignca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): 4A:BD:EE:EC:95:0D:35:9C:89:AE:C7:52:A1:2C:5B:29:F6:D6:AA:0C
camerfirmachambersca, 2008-11-1, trustedCertEntry,
证书指纹 (SHA1): 78:6A:74:AC:76:AB:14:7F:9C:6A:30:50:BA:9E:A8:7E:FE:9A:CE:3C
godaddyclass2ca, 2005-1-20, trustedCertEntry,
证书指纹 (SHA1): 27:96:BA:E6:3F:18:01:E2:77:26:1B:A0:D7:77:70:02:8F:20:EE:E4
affirmtrustpremiumca, 2014-4-15, trustedCertEntry,
证书指纹 (SHA1): D8:A6:33:2C:E0:03:6F:B1:85:F6:63:4F:7D:6A:06:65:26:32:28:27
verisignclass1g3ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5
secomevrootca1, 2008-6-3, trustedCertEntry,
证书指纹 (SHA1): FE:B8:C4:32:DC:F9:76:9A:CE:AE:3D:D8:90:8F:FD:28:86:65:64:7D
verisignclass1g2ca, 2004-3-26, trustedCertEntry,
证书指纹 (SHA1): 27:3E:E1:24:57:FD:C4:F9:0C:55:E8:2B:56:16:7F:62:F5:32:E5:47
godaddyrootg2ca, 2014-7-19, trustedCertEntry,
证书指纹 (SHA1): 47:BE:AB:C9:22:EA:E8:0E:78:78:34:62:A7:9F:45:C2:54:FD:E6:8B



在浏览器里直接访问,查看一下证书。


可以看到这个证书指纹并不在上面信任证书列表里面


但是它的根证书GeoTrust Global CA的指纹DE:28:F4...在可信任证书列表中。


=============================================================================


有时候服务器证书并没有经过签名,或者签名的根证书不是上述可信任证书。这个时候,直接使用URLConnection或者RestTemplate就会得到如下的错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target


这个时候有三个办法:
1)创建一个Trust Store, 导入Server证书或者其签名的根证书
keytool -export -alias jettyserver -keystore jettyserver.keystore -storepass jettyserverks -file jettyserver.cer
keytool -import -alias jettyserver -keystore jettyclienttrust.keystore -storepass jettyclienttrustks -file jettyserver.cer
然后在Java代码中
System.setProperty("javax.net.ssl.trustStore", "jettyclienttrust.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "jettyclienttrustks");
这个办法比较简单,但是有个缺点就是这个是全局设置,会影响其他访问HTTPS的地方。


2)直接把Server证书或者其签名的根证书导入到cacerts中。
keytool -import -alias jettyserver -keystore cacerts -storepass changeit -file c:\_tmp\jettyserver.cer
这个办法的缺点是所有部署程序的主机上都要作同样的事情,当然可以把JDK集成到程序里面。


3)自己实现证书信任管理器类,跳过证书信任的检查。可以看下参考资料1和参考资料2里面的做法。


==============================================================================
如果遇到java.security.cert.CertificateException: No subject alternative names present的错误,
原因是生成证书的时候,CN(commonName)必须和域名保持一致。比如如果CN设置了localhost,那么访问的时候不能用127.0.0.1。  


[参考资料]
1)http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html
2)http://blog.csdn.net/rongyongfeikai2/article/details/41659353
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java HTTPS客户端如何处理证书 的相关文章

随机推荐

  • wow.js

    一 页面在向下滚动的时候 有些元素会产生细小的动画效果 虽然动画比较小 但却能吸引你的注意 刚知道wow js这个插件 之前写的类似滚动时页面效果都是自己用jQuery写的 现在有了插件 开发更加快捷有效了 演示及下载地址 http www
  • PermissionX开源框架的使用

    背景 动态申请权限是一件特别繁琐的事情 涉及的权限一多 就让人头疼 Android提供给我们的运行时权限申请的API并不是很友好 比如我们需要动态申请打电话的功能 除了在roidManifest xml中声明权限之外 还要在执行拨打电话操作
  • 报错:Avoided redundant navigation to current location: “/login“.完美解决

    需求 登陆之后才能查看主页面 否则跳转至登录页 遇到的问题 一开始是打算直接在拦截器跳转路由的 发现会报错Avoided redundant navigation to current location login 后来灵机一动 用了全局路
  • vue报错:regeneratorRuntime is not defined

    报错原因是使用了 async await 没有配置 babel 导致语法不支持 所以才会报错 首先安装以下依赖 npm install babel plugin transform runtime save dev 或 npm i save
  • 【AnyQ】如何添加插件

    一 已有插件 字典插件 此类插件继承DictInterface接口 哈希词典 HashAdapter
  • SyntaxWarning: name 'x' is assigned to before global declaration global color Python

    SyntaxWarning name x is assigned to before global declaration global color Python 这种报错很大原因是在同一个函数重复使用了global 声明 举个例子 x 0
  • LiveData详细分析2

    一 LiveData是什么东西 1 基于观察者设计模式 LiveData是一种持有可被观察数据的类 被观察者 LiveData需要一个观察者对象 一般是Observer类的具体实现 当观察者的生命周期处于STARTED或RESUMED状态时
  • linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘

    dd命令是Linux UNIX 下的一个非常有用的命令 作用是用指定大小的块拷贝一个文件 并在拷贝的同时进行指定的转换 大部分用户只知道dd命令的这个用处 殊不知dd命令做usb启动盘也十分方便 下面就让我们一起来看看dd命令是如何运用到刻
  • 聊聊限流、熔断和降级

    背景 分布式系统中的调用关系错综复杂 如何保障整个系统平稳运行则显得尤为重要 限流 熔断和降级应运而生 限流 为了保障下游服务稳定性 通常会提前预估调用QPS 一旦超过预估QPS则可以进行限流 拒绝超出预估的请求 常见的限流算法有固定窗口
  • python插入单条、多条dict类型数据到clickhouse

    比如一个数据库名字叫test 表名称叫just check 插入单条dict数据 import clickhouse connect client clickhouse connect get client host 127 0 0 1 d
  • 【剑指offer】总集

    目录 前言 题目索引 数据结构 数 数据结构 数组 数据结构 字符串 数据结构 链表 数据结构 树 数据结构 队列 栈 堆 前言 想看Leetcode总集篇的点它点它 Leetcode总集篇 算法和算法题的任务目标 主要可分为 增 删 改
  • 什么是网站主服务器域名,主域名服务器是什么

    主域名服务器是什么 内容精选 换一换 香港节点和大陆节点的区别如下 香港节点购买域名后无需备案 可以直接在后台绑定域名并使用 大陆节点购买域名后需要先完成备案 才可以在后台绑定域名 香港节点支持绑定多个一级或者子域名 大陆节点只能绑定一个一
  • Linux高性能服务器编程|阅读笔记:第6章 - 高级I/O函数

    目录 简介 6 1 pipe函数 6 2 dup函数和dup2函数 6 3 readv函数和writev函数 6 4 sendfile函数 6 5 mmap函数和munmap函数 6 6 splice函数 6 7 tee函数 6 8 fcn
  • [问题解决方案]JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using

    公司最近跟外部有一个接受图片的接口让我来做 我心想这么简单 又可以偷懒喽 打开文档一看图片是base64格式的 没啥 不就是base64转字节流吗 一同操作后 测试接受参数 崩出来这个东西 然后就解决呗 总不能因为解决不了让人转变发送参数的
  • 【学习笔记】Python进行数据清洗

    写在前面的话 最近看了一个up主讲基本数据清洗操作 觉得非常好 链接如下 Python 数据清洗 用Python给数据洗澡澡 数据分析 数据清洗 数据预处理 哔哩哔哩 bilibili 评论区也有原数据集和相关代码的链接 不是广告 下面就浅
  • 小程序中scroll-view的下拉刷新和小程序页面的下拉刷新开启方法

    scroll view的下拉刷新 video wxml中
  • ES6---promise详解及用法

    一 什么是Promise Promise是ES6异步编程的一种解决方案 目前最先进的解决方案是async和await的搭配 ES8 但是它们是基于promise的 从语法上讲 Promise是一个对象或者说是构造函数 用来封装异步操作并可以
  • 项目总结之angular4.0中的@viewchild,@Input,@Output

    在项目中遇到了这样一个问题 父页面中需要操作子组件里面的方法 这个时候需要怎么做呢 项目是由ionic3 0和angular4 0构成的 代码如下 child的html页面如下 div class child div class child
  • HDU--3783:ZOJ (水题)

    1 题目源地址 http acm hdu edu cn showproblem php pid 3783 2 源代码 include
  • Java HTTPS客户端如何处理证书

    HTTPS HTTP over Secure Socket Layer 简单讲即HTTP下加入SSL层 HTTPS的安全基础是SSL 参考以前的两篇文章 Java JSSE SSL TLS编程代码实例 单向认证 Java JSSE SSL