519a77ea88b8fa38eaab1209cd230710b282038b.svn-base 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. package xin.glue.user.common;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.net.InetAddress;
  10. import java.net.InetSocketAddress;
  11. import java.net.Socket;
  12. import java.net.UnknownHostException;
  13. import java.security.KeyStore;
  14. import java.security.Principal;
  15. import java.security.SecureRandom;
  16. import java.security.Security;
  17. import java.security.cert.CertificateExpiredException;
  18. import java.security.cert.CertificateFactory;
  19. import java.util.Hashtable;
  20. import java.util.LinkedList;
  21. import java.util.List;
  22. import javax.net.ssl.HandshakeCompletedListener;
  23. import javax.net.ssl.SSLPeerUnverifiedException;
  24. import javax.net.ssl.SSLSession;
  25. import javax.net.ssl.SSLSessionContext;
  26. import javax.net.ssl.SSLSocket;
  27. import javax.net.ssl.SSLSocketFactory;
  28. import javax.security.cert.X509Certificate;
  29. import org.bouncycastle.crypto.tls.*;
  30. import org.bouncycastle.crypto.tls.Certificate;
  31. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  32. /**
  33. * Created by hzlizhou on 2016/9/9.
  34. */
  35. public class UIJ030053 extends SSLSocketFactory {
  36. static {
  37. if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
  38. Security.addProvider(new BouncyCastleProvider());
  39. }
  40. }
  41. @Override
  42. public Socket createSocket(Socket socket, final String host, int port,
  43. boolean arg3) throws IOException {
  44. if (socket == null) {
  45. socket = new Socket();
  46. }
  47. if (!socket.isConnected()) {
  48. socket.connect(new InetSocketAddress(host, port));
  49. }
  50. final TlsClientProtocol tlsClientProtocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(), new SecureRandom());
  51. return _createSSLSocket(host, tlsClientProtocol);
  52. }
  53. @Override
  54. public String[] getDefaultCipherSuites() {
  55. return null;
  56. }
  57. @Override
  58. public String[] getSupportedCipherSuites() {
  59. return null;
  60. }
  61. @Override
  62. public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
  63. throw new UnsupportedOperationException();
  64. }
  65. @Override
  66. public Socket createSocket(InetAddress host, int port) throws IOException {
  67. throw new UnsupportedOperationException();
  68. }
  69. @Override
  70. public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
  71. return null;
  72. }
  73. @Override
  74. public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
  75. throw new UnsupportedOperationException();
  76. }
  77. private SSLSocket _createSSLSocket(final String host, final TlsClientProtocol tlsClientProtocol) {
  78. return new SSLSocket() {
  79. private java.security.cert.Certificate[] peertCerts;
  80. @Override
  81. public InputStream getInputStream() throws IOException {
  82. return tlsClientProtocol.getInputStream();
  83. }
  84. @Override
  85. public OutputStream getOutputStream() throws IOException {
  86. return tlsClientProtocol.getOutputStream();
  87. }
  88. @Override
  89. public synchronized void close() throws IOException {
  90. tlsClientProtocol.close();
  91. }
  92. @Override
  93. public void addHandshakeCompletedListener(HandshakeCompletedListener arg0) {
  94. }
  95. @Override
  96. public boolean getEnableSessionCreation() {
  97. return false;
  98. }
  99. @Override
  100. public String[] getEnabledCipherSuites() {
  101. return null;
  102. }
  103. @Override
  104. public String[] getEnabledProtocols() {
  105. return null;
  106. }
  107. @Override
  108. public boolean getNeedClientAuth() {
  109. return false;
  110. }
  111. @Override
  112. public SSLSession getSession() {
  113. return new SSLSession() {
  114. @Override
  115. public int getApplicationBufferSize() {
  116. return 0;
  117. }
  118. @Override
  119. public String getCipherSuite() {
  120. throw new UnsupportedOperationException();
  121. }
  122. @Override
  123. public long getCreationTime() {
  124. throw new UnsupportedOperationException();
  125. }
  126. @Override
  127. public byte[] getId() {
  128. throw new UnsupportedOperationException();
  129. }
  130. @Override
  131. public long getLastAccessedTime() {
  132. throw new UnsupportedOperationException();
  133. }
  134. @Override
  135. public java.security.cert.Certificate[] getLocalCertificates() {
  136. throw new UnsupportedOperationException();
  137. }
  138. @Override
  139. public Principal getLocalPrincipal() {
  140. throw new UnsupportedOperationException();
  141. }
  142. @Override
  143. public int getPacketBufferSize() {
  144. throw new UnsupportedOperationException();
  145. }
  146. @Override
  147. public X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException {
  148. return null;
  149. }
  150. @Override
  151. public java.security.cert.Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
  152. return peertCerts;
  153. }
  154. @Override
  155. public String getPeerHost() {
  156. throw new UnsupportedOperationException();
  157. }
  158. @Override
  159. public int getPeerPort() {
  160. return 0;
  161. }
  162. @Override
  163. public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
  164. return null;
  165. }
  166. @Override
  167. public String getProtocol() {
  168. throw new UnsupportedOperationException();
  169. }
  170. @Override
  171. public SSLSessionContext getSessionContext() {
  172. throw new UnsupportedOperationException();
  173. }
  174. @Override
  175. public Object getValue(String arg0) {
  176. throw new UnsupportedOperationException();
  177. }
  178. @Override
  179. public String[] getValueNames() {
  180. throw new UnsupportedOperationException();
  181. }
  182. @Override
  183. public void invalidate() {
  184. throw new UnsupportedOperationException();
  185. }
  186. @Override
  187. public boolean isValid() {
  188. throw new UnsupportedOperationException();
  189. }
  190. @Override
  191. public void putValue(String arg0, Object arg1) {
  192. throw new UnsupportedOperationException();
  193. }
  194. @Override
  195. public void removeValue(String arg0) {
  196. throw new UnsupportedOperationException();
  197. }
  198. };
  199. }
  200. @Override
  201. public String[] getSupportedProtocols() {
  202. return null;
  203. }
  204. @Override
  205. public boolean getUseClientMode() {
  206. return false;
  207. }
  208. @Override
  209. public boolean getWantClientAuth() {
  210. return false;
  211. }
  212. @Override
  213. public void removeHandshakeCompletedListener(HandshakeCompletedListener arg0) {
  214. }
  215. @Override
  216. public void setEnableSessionCreation(boolean arg0) {
  217. }
  218. @Override
  219. public void setEnabledCipherSuites(String[] arg0) {
  220. }
  221. @Override
  222. public void setEnabledProtocols(String[] arg0) {
  223. }
  224. @Override
  225. public void setNeedClientAuth(boolean arg0) {
  226. }
  227. @Override
  228. public void setUseClientMode(boolean arg0) {
  229. }
  230. @Override
  231. public void setWantClientAuth(boolean arg0) {
  232. }
  233. @Override
  234. public String[] getSupportedCipherSuites() {
  235. return null;
  236. }
  237. @Override
  238. public void startHandshake() throws IOException {
  239. tlsClientProtocol.connect(new DefaultTlsClient() {
  240. @SuppressWarnings("unchecked")
  241. @Override
  242. public Hashtable<Integer, byte[]> getClientExtensions() throws IOException {
  243. Hashtable<Integer, byte[]> clientExtensions = super.getClientExtensions();
  244. if (clientExtensions == null) {
  245. clientExtensions = new Hashtable<Integer, byte[]>();
  246. }
  247. //Add host_name
  248. byte[] host_name = host.getBytes();
  249. final ByteArrayOutputStream baos = new ByteArrayOutputStream();
  250. final DataOutputStream dos = new DataOutputStream(baos);
  251. dos.writeShort(host_name.length + 3);
  252. dos.writeByte(0);
  253. dos.writeShort(host_name.length);
  254. dos.write(host_name);
  255. dos.close();
  256. clientExtensions.put(ExtensionType.server_name, baos.toByteArray());
  257. return clientExtensions;
  258. }
  259. @Override
  260. public TlsAuthentication getAuthentication() throws IOException {
  261. return new TlsAuthentication() {
  262. @Override
  263. public void notifyServerCertificate(Certificate serverCertificate) throws IOException {
  264. try {
  265. KeyStore ks = _loadKeyStore();
  266. CertificateFactory cf = CertificateFactory.getInstance("X.509");
  267. List<java.security.cert.Certificate> certs = new LinkedList<java.security.cert.Certificate>();
  268. boolean trustedCertificate = false;
  269. for (org.bouncycastle.asn1.x509.Certificate c : ((org.bouncycastle.crypto.tls.Certificate) serverCertificate).getCertificateList()) {
  270. java.security.cert.Certificate cert = cf.generateCertificate(new ByteArrayInputStream(c.getEncoded()));
  271. certs.add(cert);
  272. String alias = ks.getCertificateAlias(cert);
  273. if (alias != null) {
  274. if (cert instanceof java.security.cert.X509Certificate) {
  275. try {
  276. ((java.security.cert.X509Certificate) cert).checkValidity();
  277. trustedCertificate = true;
  278. } catch (CertificateExpiredException cee) {
  279. // Accept all the certs!
  280. }
  281. }
  282. } else {
  283. // Accept all the certs!
  284. }
  285. }
  286. if (!trustedCertificate) {
  287. // Accept all the certs!
  288. }
  289. peertCerts = certs.toArray(new java.security.cert.Certificate[0]);
  290. } catch (Exception ex) {
  291. ex.printStackTrace();
  292. throw new IOException(ex);
  293. }
  294. }
  295. @Override
  296. public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException {
  297. return null;
  298. }
  299. private KeyStore _loadKeyStore() throws Exception {
  300. FileInputStream trustStoreFis = null;
  301. try {
  302. KeyStore localKeyStore = null;
  303. String trustStoreType = System.getProperty("javax.net.ssl.trustStoreType") != null ? System.getProperty("javax.net.ssl.trustStoreType") : KeyStore.getDefaultType();
  304. String trustStoreProvider = System.getProperty("javax.net.ssl.trustStoreProvider") != null ? System.getProperty("javax.net.ssl.trustStoreProvider") : "";
  305. if (trustStoreType.length() != 0) {
  306. if (trustStoreProvider.length() == 0) {
  307. localKeyStore = KeyStore.getInstance(trustStoreType);
  308. } else {
  309. localKeyStore = KeyStore.getInstance(trustStoreType, trustStoreProvider);
  310. }
  311. char[] keyStorePass = null;
  312. String str5 = System.getProperty("javax.net.ssl.trustStorePassword") != null ? System.getProperty("javax.net.ssl.trustStorePassword") : "";
  313. if (str5.length() != 0) {
  314. keyStorePass = str5.toCharArray();
  315. }
  316. localKeyStore.load(trustStoreFis, keyStorePass);
  317. if (keyStorePass != null) {
  318. for (int i = 0; i < keyStorePass.length; i++) {
  319. keyStorePass[i] = 0;
  320. }
  321. }
  322. }
  323. return localKeyStore;
  324. } finally {
  325. if (trustStoreFis != null) {
  326. trustStoreFis.close();
  327. }
  328. }
  329. }
  330. };
  331. }
  332. });
  333. } // startHandshake
  334. };
  335. }
  336. }