This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 7ce04f5 [SCB-1856]support reading certificates in jar (#2126)
7ce04f5 is described below
commit 7ce04f5d2f0bc4450a597a3cca3670724191f8f2
Author: bao liu <[email protected]>
AuthorDate: Sat Dec 12 15:33:24 2020 +0800
[SCB-1856]support reading certificates in jar (#2126)
---
.../org/apache/servicecomb/demo/DemoSSLCustom.java | 28 +++++++++----
.../servicecomb/foundation/ssl/KeyStoreUtil.java | 48 +++++++++++++++-------
.../servicecomb/foundation/ssl/SSLManager.java | 38 ++++++++---------
.../servicecomb/foundation/ssl/SSLManagerTest.java | 10 +++++
.../test/resources/server.ssl.resource.properties | 35 ++++++++++++++++
.../foundation/vertx/VertxTLSBuilder.java | 23 ++++++++---
6 files changed, 134 insertions(+), 48 deletions(-)
diff --git
a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/DemoSSLCustom.java
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/DemoSSLCustom.java
index 7666e24..42601cc 100644
---
a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/DemoSSLCustom.java
+++
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/DemoSSLCustom.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.demo;
import java.io.File;
import java.net.URL;
+import org.apache.commons.lang3.StringUtils;
import org.apache.servicecomb.foundation.ssl.SSLCustom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,8 +37,21 @@ public class DemoSSLCustom extends SSLCustom {
public String getFullPath(String filename) {
LOGGER.info("current working dir :" + System.getProperty("user.dir"));
- // local
- File localFile = new File(System.getProperty("user.dir") +
"/src/main/resources/certificates/" + filename);
+ if (StringUtils.isEmpty(filename)) {
+ return null;
+ }
+
+ // local for different IDEs
+ File localFile = new File(
+ System.getProperty("user.dir") +
"/demo/demo-springmvc/springmvc-server/src/main/resources/certificates/"
+ + filename);
+ if (localFile.isFile()) {
+ return localFile.getAbsolutePath();
+ }
+
+ localFile = new File(
+ System.getProperty("user.dir") + "/src/main/resources/certificates/"
+ + filename);
if (localFile.isFile()) {
return localFile.getAbsolutePath();
}
@@ -53,12 +67,8 @@ public class DemoSSLCustom extends SSLCustom {
return localFile.getAbsolutePath();
}
- // debug
- URL url =
Thread.currentThread().getContextClassLoader().getResource("certificates/" +
filename);
- if (url == null) {
- return filename;
- }
-
- return url.getPath();
+ // in jar, maybe
+ LOGGER.info("not found file {} in file system, maybe in jar.", filename);
+ return "certificates/" + filename;
}
}
diff --git
a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/KeyStoreUtil.java
b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/KeyStoreUtil.java
index 63aa00e..525cf91 100644
---
a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/KeyStoreUtil.java
+++
b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/KeyStoreUtil.java
@@ -17,10 +17,12 @@
package org.apache.servicecomb.foundation.ssl;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URL;
import java.security.KeyStore;
import java.security.cert.CRL;
import java.security.cert.CRLException;
@@ -38,25 +40,43 @@ public final class KeyStoreUtil {
}
- public static KeyStore createKeyStore(String storename, String storetype,
- char[] storevalue) {
- InputStream is = null;
+ public static KeyStore createKeyStore(String storeName, String storeType,
+ char[] storeValue) {
+ if (storeName == null) {
+ return null;
+ }
+
+ File storeFile = new File(storeName);
+
try {
- KeyStore keystore = KeyStore.getInstance(storetype);
- is = new FileInputStream(storename);
- keystore.load(is, storevalue);
+ if (storeFile.isFile()) {
+ return createKeyStore(new FileInputStream(storeFile), storeType,
storeValue);
+ }
+
+ ClassLoader classLoader =
+ Thread.currentThread().getContextClassLoader() == null ?
KeyStoreUtil.class.getClassLoader()
+ : Thread.currentThread().getContextClassLoader();
+ URL resource = classLoader.getResource(storeName);
+ if (resource != null) {
+ return createKeyStore(resource.openStream(), storeType, storeValue);
+ }
+ } catch (IOException e) {
+ throw new IllegalArgumentException("Bad key store or value."
+ + e.getMessage());
+ }
+
+ return null;
+ }
+
+ public static KeyStore createKeyStore(InputStream store, String storeType,
+ char[] storeValue) {
+ try (InputStream is = store) {
+ KeyStore keystore = KeyStore.getInstance(storeType);
+ keystore.load(is, storeValue);
return keystore;
} catch (Exception e) {
throw new IllegalArgumentException("Bad key store or value."
+ e.getMessage());
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (IOException e) {
- ignore();
- }
- }
}
}
diff --git
a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLManager.java
b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLManager.java
index 0b28c5b..916d4b0 100644
---
a/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLManager.java
+++
b/foundations/foundation-ssl/src/main/java/org/apache/servicecomb/foundation/ssl/SSLManager.java
@@ -47,29 +47,29 @@ public final class SSLManager {
public static SSLContext createSSLContext(SSLOption option, SSLCustom
custom) {
try {
String keyStoreName = custom.getFullPath(option.getKeyStore());
- KeyManager[] keymanager;
- if (keyStoreName != null && new File(keyStoreName).exists()) {
- char[] keyStoreValue =
- custom.decode(option.getKeyStoreValue().toCharArray());
- KeyStore keyStore =
- KeyStoreUtil.createKeyStore(keyStoreName,
- option.getKeyStoreType(),
- keyStoreValue);
- keymanager =
+ char[] keyStoreValue = option.getKeyStoreValue() == null ? new char[0] :
+ custom.decode(option.getKeyStoreValue().toCharArray());
+ KeyStore keyStore =
+ KeyStoreUtil.createKeyStore(keyStoreName,
+ option.getKeyStoreType(),
+ keyStoreValue);
+
+ KeyManager[] keyManager = null;
+ if (keyStore != null) {
+ keyManager =
KeyStoreUtil.createKeyManagers(keyStore, keyStoreValue);
- } else {
- keymanager = null;
}
String trustStoreName = custom.getFullPath(option.getTrustStore());
+ char[] trustStoreValue = option.getTrustStoreValue() == null ? new
char[0] :
+ custom.decode(option.getTrustStoreValue().toCharArray());
+ KeyStore trustStore =
+ KeyStoreUtil.createKeyStore(trustStoreName,
+ option.getTrustStoreType(),
+ trustStoreValue);
+
TrustManager[] trustManager;
- if (trustStoreName != null && new File(trustStoreName).exists()) {
- char[] trustStoreValue =
- custom.decode(option.getTrustStoreValue().toCharArray());
- KeyStore trustStore =
- KeyStoreUtil.createKeyStore(trustStoreName,
- option.getTrustStoreType(),
- trustStoreValue);
+ if (trustStore != null) {
trustManager =
KeyStoreUtil.createTrustManagers(trustStore);
} else {
@@ -85,7 +85,7 @@ public final class SSLManager {
// ?: ssl context version
SSLContext context = SSLContext.getInstance("TLS");
- context.init(keymanager, wrapped, new SecureRandom());
+ context.init(keyManager, wrapped, new SecureRandom());
return context;
} catch (NoSuchAlgorithmException e) {
throw new IllegalArgumentException("NoSuchAlgorithmException."
diff --git
a/foundations/foundation-ssl/src/test/java/org/apache/servicecomb/foundation/ssl/SSLManagerTest.java
b/foundations/foundation-ssl/src/test/java/org/apache/servicecomb/foundation/ssl/SSLManagerTest.java
index 3121367..ac609e1 100644
---
a/foundations/foundation-ssl/src/test/java/org/apache/servicecomb/foundation/ssl/SSLManagerTest.java
+++
b/foundations/foundation-ssl/src/test/java/org/apache/servicecomb/foundation/ssl/SSLManagerTest.java
@@ -227,6 +227,16 @@ public class SSLManagerTest {
}
@Test
+ public void testCreateSSLContextResource() {
+ SSLOption option = SSLOption.build(DIR +
"/server.ssl.resource.properties");
+
+ SSLCustom custom = SSLCustom.defaultSSLCustom();
+
+ SSLContext context = SSLManager.createSSLContext(option, custom);
+ Assert.assertNotNull(context);
+ }
+
+ @Test
public void testCreateSSLContextException() {
SSLOption option = SSLOption.build(DIR + "/server.ssl.properties");
diff --git
a/foundations/foundation-ssl/src/test/resources/server.ssl.resource.properties
b/foundations/foundation-ssl/src/test/resources/server.ssl.resource.properties
new file mode 100644
index 0000000..f1327ee
--- /dev/null
+++
b/foundations/foundation-ssl/src/test/resources/server.ssl.resource.properties
@@ -0,0 +1,35 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#########SSL options
+ssl.protocols=TLSv1.2,TLSv1.1,TLSv1,SSLv2Hello
+ssl.ciphers=TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA
+ssl.authPeer=true
+ssl.checkCN.host=true
+ssl.checkCN.white=true
+ssl.checkCN.white.file=white.list
+ssl.allowRenegociate=false
+
+#########certificates config
+ssl.storePath=internal
+ssl.trustStore=ssl/trust.jks
+ssl.trustStoreType=JKS
+ssl.trustStoreValue=Changeme_123
+ssl.keyStore=ssl/server.p12
+ssl.keyStoreType=PKCS12
+ssl.keyStoreValue=Changeme_123
+ssl.crl=revoke.crl
diff --git
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
index 5f8434d..74d0498 100644
---
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
+++
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/VertxTLSBuilder.java
@@ -18,9 +18,12 @@
package org.apache.servicecomb.foundation.vertx;
import java.io.File;
+import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.servicecomb.foundation.ssl.KeyStoreUtil;
import org.apache.servicecomb.foundation.ssl.SSLCustom;
import org.apache.servicecomb.foundation.ssl.SSLManager;
import org.apache.servicecomb.foundation.ssl.SSLOption;
@@ -103,12 +106,12 @@ public final class VertxTLSBuilder {
if (isFileExists(fullKeyStore)) {
if (STORE_PKCS12.equalsIgnoreCase(sslOption.getKeyStoreType())) {
PfxOptions keyPfxOptions = new PfxOptions();
- keyPfxOptions.setPath(sslCustom.getFullPath(sslOption.getKeyStore()));
+ keyPfxOptions.setPath(fullKeyStore);
keyPfxOptions.setPassword(new
String(sslCustom.decode(sslOption.getKeyStoreValue().toCharArray())));
tcpClientOptions.setPfxKeyCertOptions(keyPfxOptions);
} else if (STORE_JKS.equalsIgnoreCase(sslOption.getKeyStoreType())) {
JksOptions keyJksOptions = new JksOptions();
- keyJksOptions.setPath(sslCustom.getFullPath(sslOption.getKeyStore()));
+ keyJksOptions.setPath(fullKeyStore);
keyJksOptions.setPassword(new
String(sslCustom.decode(sslOption.getKeyStoreValue().toCharArray())));
tcpClientOptions.setKeyStoreOptions(keyJksOptions);
} else {
@@ -121,13 +124,13 @@ public final class VertxTLSBuilder {
if (isFileExists(fullTrustStore)) {
if (STORE_PKCS12.equalsIgnoreCase(sslOption.getTrustStoreType())) {
PfxOptions trustPfxOptions = new PfxOptions();
-
trustPfxOptions.setPath(sslCustom.getFullPath(sslOption.getTrustStore()));
+ trustPfxOptions.setPath(fullTrustStore);
trustPfxOptions
.setPassword(new
String(sslCustom.decode(sslOption.getTrustStoreValue().toCharArray())));
tcpClientOptions.setPfxTrustOptions(trustPfxOptions);
} else if (STORE_JKS.equalsIgnoreCase(sslOption.getTrustStoreType())) {
JksOptions trustJksOptions = new JksOptions();
-
trustJksOptions.setPath(sslCustom.getFullPath(sslOption.getTrustStore()));
+ trustJksOptions.setPath(fullTrustStore);
trustJksOptions
.setPassword(new
String(sslCustom.decode(sslOption.getTrustStoreValue().toCharArray())));
tcpClientOptions.setTrustStoreOptions(trustJksOptions);
@@ -152,10 +155,18 @@ public final class VertxTLSBuilder {
}
private static boolean isFileExists(String name) {
- if (name == null || name.isEmpty()) {
+ if (StringUtils.isEmpty(name)) {
return false;
}
File f = new File(name);
- return f.exists();
+ if (f.isFile()) {
+ return true;
+ }
+
+ ClassLoader classLoader =
+ Thread.currentThread().getContextClassLoader() == null ?
VertxTLSBuilder.class.getClassLoader()
+ : Thread.currentThread().getContextClassLoader();
+ URL resource = classLoader.getResource(name);
+ return resource != null;
}
}