Skip to content

Commit 1d1e3fe

Browse files
committed
+ow.format.getTLSCertificates
1 parent 934d918 commit 1d1e3fe

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

js/owrap.format.js

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1251,6 +1251,69 @@ OpenWrap.format.prototype.getPublicIP = function() {
12511251
return $rest().get("https://ifconfig.co/json");
12521252
};
12531253

1254+
/**
1255+
* <odoc>
1256+
* <key>ow.format.getTLSCertificates(aHost, aPort, withJava, aPath, aPass, aSoTimeout) : Array</key>
1257+
* Tries to retreive the TLS certificates from aHost, aPort (defaults to 443). Optionally if withJava=true the original certificate
1258+
* Java object will also be included. If the CA certificates is in a different location you can provide aPath and the corresponding aPass.
1259+
* Additionally you can specificy aSoTimeout (socket timeout in ms) which defaults to 10s.
1260+
* </odoc>
1261+
*/
1262+
OpenWrap.format.prototype.getTLSCertificates = function(aHost, aPort, withJava, aPath, aPass, aSoTimeout) {
1263+
_$(aHost, "aHost").isString().$_();
1264+
aPort = _$(aPort, "aPort").isNumber().default(443);
1265+
aPath = _$(aPath, "aPath").isString().default(ow.format.getJavaHome() + "/lib/security/cacerts");
1266+
aPass = _$(aPass, "aPass").isString().default("changeit");
1267+
withJava = _$(withJava, "withJava").isBoolean().default(false);
1268+
aSoTimeout = _$(aSoTimeout, "aSoTimeout").isNumber().default(10000);
1269+
1270+
var context = javax.net.ssl.SSLContext.getInstance("TLS");
1271+
var tmf = javax.net.ssl.TrustManagerFactory.getInstance(javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm());
1272+
var ks = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType());
1273+
ks.load(io.readFileStream(aPath), (new java.lang.String(aPass)).toCharArray());
1274+
tmf.init(ks);
1275+
var defaultTrustManager = tmf.getTrustManagers()[0];
1276+
var cchain;
1277+
var tm = new JavaAdapter(javax.net.ssl.X509TrustManager, {
1278+
getAcceptedIssuers: function() {
1279+
return new java.security.cert.X509Certificate();
1280+
},
1281+
checkClientTrusted: function() {
1282+
throw new javax.net.ssl.UnsupportedOperationException();
1283+
},
1284+
checkServerTrusted: function(chain, authType) {
1285+
cchain = chain;
1286+
defaultTrustManager.checkServerTrusted(chain, authType);
1287+
}
1288+
});
1289+
context.init(null, [tm], null);
1290+
var factory = context.getSocketFactory();
1291+
1292+
var socket = factory.createSocket(aHost, aPort);
1293+
socket.setSoTimeout(aSoTimeout);
1294+
try {
1295+
socket.startHandshake();
1296+
} catch(e) {
1297+
}
1298+
socket.close();
1299+
1300+
var sres = af.fromJavaArray(cchain);
1301+
var res = sres.map(r => {
1302+
var rr = {
1303+
issuerDN : r.getIssuerDN(),
1304+
subjectDN : r.getSubjectDN(),
1305+
notBefore : new Date( r.getNotBefore().toGMTString() ),
1306+
notAfter : new Date( r.getNotAfter().toGMTString() )
1307+
};
1308+
if (withJava) rr.javaObj = r;
1309+
if (!isNull(r.getSubjectAlternativeNames())) rr.alternatives = af.fromJavaArray( r.getSubjectAlternativeNames().toArray() ).map(af.fromJavaArray);
1310+
1311+
return rr;
1312+
});
1313+
1314+
return res;
1315+
};
1316+
12541317
/**
12551318
* <odoc>
12561319
* <key>ow.format.testPublicPort(aPort) : Map</key>

0 commit comments

Comments
 (0)