forked from line/armeria
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for a Spring Boot custom key alias (line#1865)
Motivation: The `ssl.keyAlias` configuration in Spring Boot is currently unsupported. Modifications: - Add `CustomAliasKeyManagerFactory` and `CustomAliasX509ExtendedKeyManager` - Wrap the `KeyManagerFactory` with `CustomAliasKeyManagerFactory` to support custom key alias - Miscellaneous: - Add `@Nullable` annotations where necessary Result: - Fixes line#1843
- Loading branch information
Showing
13 changed files
with
392 additions
and
18 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,8 @@ | ||
*.bat text eol=crlf | ||
*.br binary | ||
*.gz binary | ||
*.jks binary | ||
*.pkcs12 binary | ||
|
||
/gradlew text eol=lf | ||
|
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
57 changes: 57 additions & 0 deletions
57
...gure/src/main/java/com/linecorp/armeria/internal/spring/CustomAliasKeyManagerFactory.java
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
/* | ||
* Copyright 2019 LINE Corporation | ||
* | ||
* LINE Corporation 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: | ||
* | ||
* https://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. | ||
*/ | ||
package com.linecorp.armeria.internal.spring; | ||
|
||
import java.security.InvalidAlgorithmParameterException; | ||
import java.security.KeyStore; | ||
import java.security.KeyStoreException; | ||
import java.security.NoSuchAlgorithmException; | ||
import java.security.UnrecoverableKeyException; | ||
|
||
import javax.net.ssl.KeyManager; | ||
import javax.net.ssl.KeyManagerFactory; | ||
import javax.net.ssl.KeyManagerFactorySpi; | ||
import javax.net.ssl.ManagerFactoryParameters; | ||
import javax.net.ssl.X509ExtendedKeyManager; | ||
|
||
final class CustomAliasKeyManagerFactory extends KeyManagerFactory { | ||
CustomAliasKeyManagerFactory(KeyManagerFactory delegate, String alias) { | ||
super(new KeyManagerFactorySpi() { | ||
@Override | ||
protected void engineInit(KeyStore ks, char[] password) | ||
throws KeyStoreException, NoSuchAlgorithmException, UnrecoverableKeyException { | ||
delegate.init(ks, password); | ||
} | ||
|
||
@Override | ||
protected void engineInit(ManagerFactoryParameters spec) throws InvalidAlgorithmParameterException { | ||
delegate.init(spec); | ||
} | ||
|
||
@Override | ||
protected KeyManager[] engineGetKeyManagers() { | ||
final KeyManager[] keyManagers = delegate.getKeyManagers().clone(); | ||
for (int i = 0; i < keyManagers.length; i++) { | ||
if (keyManagers[i] instanceof X509ExtendedKeyManager) { | ||
final X509ExtendedKeyManager keyManager = (X509ExtendedKeyManager) keyManagers[i]; | ||
keyManagers[i] = new CustomAliasX509ExtendedKeyManager(keyManager, alias); | ||
} | ||
} | ||
return keyManagers; | ||
} | ||
}, delegate.getProvider(), delegate.getAlgorithm()); | ||
} | ||
} |
89 changes: 89 additions & 0 deletions
89
...src/main/java/com/linecorp/armeria/internal/spring/CustomAliasX509ExtendedKeyManager.java
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* Copyright 2019 LINE Corporation | ||
* | ||
* LINE Corporation 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: | ||
* | ||
* https://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. | ||
*/ | ||
package com.linecorp.armeria.internal.spring; | ||
|
||
import java.net.Socket; | ||
import java.security.Principal; | ||
import java.security.PrivateKey; | ||
import java.security.cert.X509Certificate; | ||
|
||
import javax.net.ssl.SSLEngine; | ||
import javax.net.ssl.X509ExtendedKeyManager; | ||
|
||
import com.google.common.base.MoreObjects; | ||
|
||
/** | ||
* {@link X509ExtendedKeyManager} chooses the given alias for the server side. | ||
*/ | ||
final class CustomAliasX509ExtendedKeyManager extends X509ExtendedKeyManager { | ||
|
||
private final X509ExtendedKeyManager delegate; | ||
|
||
private final String alias; | ||
|
||
CustomAliasX509ExtendedKeyManager(X509ExtendedKeyManager delegate, String alias) { | ||
this.delegate = delegate; | ||
this.alias = alias; | ||
} | ||
|
||
@Override | ||
public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine) { | ||
return alias; | ||
} | ||
|
||
@Override | ||
public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) { | ||
return alias; | ||
} | ||
|
||
@Override | ||
public String[] getServerAliases(String keyType, Principal[] issuers) { | ||
return delegate.getServerAliases(keyType, issuers); | ||
} | ||
|
||
@Override | ||
public String chooseEngineClientAlias(String[] keyType, Principal[] issuers, SSLEngine engine) { | ||
return delegate.chooseEngineClientAlias(keyType, issuers, engine); | ||
} | ||
|
||
@Override | ||
public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) { | ||
return delegate.chooseClientAlias(keyType, issuers, socket); | ||
} | ||
|
||
@Override | ||
public String[] getClientAliases(String keyType, Principal[] issuers) { | ||
return delegate.getClientAliases(keyType, issuers); | ||
} | ||
|
||
@Override | ||
public X509Certificate[] getCertificateChain(String alias) { | ||
return delegate.getCertificateChain(alias); | ||
} | ||
|
||
@Override | ||
public PrivateKey getPrivateKey(String alias) { | ||
return delegate.getPrivateKey(alias); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return MoreObjects.toStringHelper(this) | ||
.add("alias", alias) | ||
.add("delegate", delegate) | ||
.toString(); | ||
} | ||
} |
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
Oops, something went wrong.