Created
August 2, 2023 13:40
-
-
Save dhval/a4ed8531f905b39bdd871da8a4a436ac to your computer and use it in GitHub Desktop.
Add SSL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javax.net.ssl.*; | |
import java.io.*; | |
import java.security.KeyStore; | |
import java.security.MessageDigest; | |
import java.security.cert.CertificateException; | |
import java.security.cert.X509Certificate; | |
public class Test { | |
private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray(); | |
public static void trustSsl(String host, int port) throws Exception { | |
// using default trust store phrase | |
char[] passphrase = "changeit".toCharArray(); | |
char separatorChar = File.separatorChar; | |
// determine trust store file | |
File dir = new File(System.getProperty("java.home") | |
+ separatorChar + "lib" + separatorChar + "security"); | |
File file = new File(dir, "jssecacerts"); | |
if (!file.isFile()) { | |
file = new File(dir, "cacerts"); | |
} | |
// load trust store contents | |
System.out.println("Loading KeyStore " + file + "..."); | |
InputStream in = new FileInputStream(file); | |
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); | |
ks.load(in, passphrase); | |
in.close(); | |
// add certificate | |
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(); | |
SSLSocket socket; | |
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; | |
} | |
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(); | |
} | |
int k = 0; | |
X509Certificate cert = chain[k]; | |
String alias = host + "-" + (k + 1); | |
ks.setCertificateEntry(alias, cert); | |
OutputStream out = new FileOutputStream(file); | |
ks.store(out, passphrase); | |
out.close(); | |
System.out.println(); | |
System.out.println(cert); | |
System.out.println(); | |
System.out.println("Added certificate to keystore using alias '" + alias + "'"); | |
} | |
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() { | |
return new X509Certificate[0]; | |
} | |
public void checkClientTrusted(X509Certificate[] chain, String authType) { | |
throw new UnsupportedOperationException(); | |
} | |
public void checkServerTrusted(X509Certificate[] chain, String authType) | |
throws CertificateException { | |
this.chain = chain; | |
tm.checkServerTrusted(chain, authType); | |
} | |
} | |
public static void main(String[] args) throws Exception { | |
trustSsl("registry.npmjs.org", 443); | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment