|
28 | 28 | package org.jruby.ext.openssl.x509store;
|
29 | 29 |
|
30 | 30 |
|
| 31 | +import java.io.File; |
31 | 32 | import java.io.IOException;
|
32 | 33 | import java.math.BigInteger;
|
33 | 34 | import java.util.Arrays;
|
@@ -292,13 +293,48 @@ else if ( keyUsage != null && ! keyUsage[5] ) { // KU_KEY_CERT_SIGN
|
292 | 293 | public static final String X509_PRIVATE_DIR;
|
293 | 294 |
|
294 | 295 | static {
|
295 |
| - OPENSSLDIR = "/usr/local/openssl"; // NOTE: blindly follow?! |
| 296 | + // roughly following the ideas from https://www.happyassassin.net/2015/01/12/a-note-about-ssltls-trusted-certificate-stores-and-platforms/ |
| 297 | + // and falling back to trust store from java to be on the save side |
| 298 | + |
296 | 299 | // TODO usability in limited environments should be tested/reviewed
|
297 | 300 | final String JAVA_HOME = SafePropertyAccessor.getProperty("java.home", "");
|
298 |
| - X509_CERT_AREA = JAVA_HOME + "/lib/security"; |
299 |
| - X509_CERT_DIR = X509_CERT_AREA; |
300 |
| - X509_CERT_FILE = X509_CERT_DIR + "/cacerts"; |
301 |
| - X509_PRIVATE_DIR = "/usr/lib/ssl/private"; // NOTE: blindly follow?! |
| 301 | + |
| 302 | + // if the default files/dirs exist we use them. with this a switch |
| 303 | + // from MRI to JRuby produces the same results. otherwise we use the |
| 304 | + // certs from JAVA_HOME. |
| 305 | + final String MAYBE_CERT_FILE; |
| 306 | + final String LINUX_CERT_AREA = "/etc/ssl"; |
| 307 | + final String MACOS_CERT_AREA = "/System/Library/OpenSSL"; |
| 308 | + final String MAYBE_PKI_CERT_FILE = "/etc/pki/tls/certs/ca-bundle.crt"; |
| 309 | + if (new File(LINUX_CERT_AREA).exists()) { |
| 310 | + X509_CERT_AREA = LINUX_CERT_AREA; |
| 311 | + X509_CERT_DIR = X509_CERT_AREA + "/certs"; |
| 312 | + X509_PRIVATE_DIR = X509_CERT_AREA + "/private"; |
| 313 | + MAYBE_CERT_FILE = X509_CERT_DIR + "/cert.pem"; |
| 314 | + } |
| 315 | + else if (new File(MACOS_CERT_AREA).exists()) { |
| 316 | + X509_CERT_AREA = MACOS_CERT_AREA; |
| 317 | + X509_CERT_DIR = X509_CERT_AREA + "/certs"; |
| 318 | + X509_PRIVATE_DIR = X509_CERT_AREA + "/private"; |
| 319 | + MAYBE_CERT_FILE = X509_CERT_AREA + "/cert.pem"; |
| 320 | + } |
| 321 | + else { |
| 322 | + X509_CERT_AREA = JAVA_HOME + "/lib/security"; |
| 323 | + X509_CERT_DIR = X509_CERT_AREA; |
| 324 | + X509_PRIVATE_DIR = X509_CERT_AREA; |
| 325 | + MAYBE_CERT_FILE = MAYBE_PKI_CERT_FILE; |
| 326 | + } |
| 327 | + if (new File(MAYBE_PKI_CERT_FILE).exists()) { |
| 328 | + X509_CERT_FILE = MAYBE_PKI_CERT_FILE; |
| 329 | + } |
| 330 | + else if (new File(MAYBE_CERT_FILE).exists()) { |
| 331 | + X509_CERT_FILE = MAYBE_CERT_FILE; |
| 332 | + } |
| 333 | + else { |
| 334 | + X509_CERT_FILE = JAVA_HOME + "/lib/security/cacerts"; |
| 335 | + } |
| 336 | + // keep it with some meaninful content as it is a public constant |
| 337 | + OPENSSLDIR = X509_CERT_AREA; |
302 | 338 | }
|
303 | 339 |
|
304 | 340 | public static final String X509_CERT_DIR_EVP = "SSL_CERT_DIR";
|
|
0 commit comments