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.youkuaiyun.com/rongyongfeikai2/article/details/41659353