Skip to content

Commit 7f73fed

Browse files
committed
0.18.1: - integration des BouncyCastleJsseProvider und bouncy castle versionen 1.75
1 parent de49178 commit 7f73fed

File tree

10 files changed

+134
-59
lines changed

10 files changed

+134
-59
lines changed

CHANGELOG.md

+15
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
```
2020
```
2121

22+
## [0.18.1]
23+
24+
### Added
25+
```
26+
```
27+
28+
### Changed
29+
```
30+
```
31+
32+
### Fixed
33+
```
34+
- integration des BouncyCastleJsseProvider und bouncy castle versionen 1.75
35+
```
36+
2237
## [0.17.0]
2338

2439
### Added

pom.xml

+19-14
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111
<groupId>net.sberg</groupId>
1212
<artifactId>openkim</artifactId>
13-
<version>0.18.0</version>
13+
<version>0.18.1</version>
1414
<name>openkim</name>
1515
<description>Open KIM Client Modul</description>
1616

@@ -99,17 +99,22 @@
9999
<dependency>
100100
<groupId>org.bouncycastle</groupId>
101101
<artifactId>bcprov-jdk18on</artifactId>
102-
<version>1.72</version>
102+
<version>1.75</version>
103103
</dependency>
104104
<dependency>
105105
<groupId>org.bouncycastle</groupId>
106106
<artifactId>bcmail-jdk18on</artifactId>
107-
<version>1.72</version>
107+
<version>1.75</version>
108108
</dependency>
109109
<dependency>
110110
<groupId>org.bouncycastle</groupId>
111111
<artifactId>bcpkix-jdk18on</artifactId>
112-
<version>1.72</version>
112+
<version>1.75</version>
113+
</dependency>
114+
<dependency>
115+
<groupId>org.bouncycastle</groupId>
116+
<artifactId>bctls-jdk18on</artifactId>
117+
<version>1.75</version>
113118
</dependency>
114119
<dependency>
115120
<groupId>dnsjava</groupId>
@@ -130,6 +135,16 @@
130135
<groupId>net.sf.jasperreports</groupId>
131136
<artifactId>jasperreports</artifactId>
132137
<version>6.20.0</version>
138+
<exclusions>
139+
<exclusion>
140+
<groupId>org.bouncycastle</groupId>
141+
<artifactId>bcutil-jdk15on</artifactId>
142+
</exclusion>
143+
<exclusion>
144+
<groupId>org.bouncycastle</groupId>
145+
<artifactId>bcprov-jdk15on</artifactId>
146+
</exclusion>
147+
</exclusions>
133148
</dependency>
134149
<dependency>
135150
<groupId>org.apache.httpcomponents</groupId>
@@ -204,16 +219,6 @@
204219
<version>1.18.24</version>
205220
<scope>provided</scope>
206221
</dependency>
207-
<!--dependency>
208-
<groupId>javax.xml.bind</groupId>
209-
<artifactId>jaxb-api</artifactId>
210-
<version>2.3.1</version>
211-
</dependency>
212-
<dependency>
213-
<groupId>javax.xml.ws</groupId>
214-
<artifactId>jaxws-api</artifactId>
215-
<version>2.3.1</version>
216-
</dependency-->
217222
</dependencies>
218223

219224
<build>

src/main/java/net/sberg/openkim/AppConfig.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import jakarta.annotation.PostConstruct;
2121
import org.bouncycastle.jce.provider.BouncyCastleProvider;
22+
import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider;
2223
import org.slf4j.Logger;
2324
import org.slf4j.LoggerFactory;
2425
import org.springframework.boot.web.servlet.FilterRegistrationBean;
@@ -39,7 +40,8 @@ public class AppConfig {
3940

4041
@PostConstruct
4142
public void init() throws Exception {
42-
Security.addProvider(new BouncyCastleProvider());
43+
Security.insertProviderAt(new BouncyCastleProvider(), 1);
44+
Security.insertProviderAt(new BouncyCastleJsseProvider(), 1);
4345
}
4446

4547
@Bean

src/main/java/net/sberg/openkim/gateway/GatewayKeystoreService.java

+64-29
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,38 @@
1616
*/
1717
package net.sberg.openkim.gateway;
1818

19-
import io.netty.handler.ssl.util.SelfSignedCertificate;
20-
import net.sberg.openkim.common.FileUtils;
2119
import net.sberg.openkim.common.ICommonConstants;
20+
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
21+
import org.bouncycastle.asn1.x500.X500Name;
22+
import org.bouncycastle.asn1.x509.*;
23+
import org.bouncycastle.cert.X509ExtensionUtils;
24+
import org.bouncycastle.cert.X509v3CertificateBuilder;
25+
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
26+
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
27+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
28+
import org.bouncycastle.operator.ContentSigner;
29+
import org.bouncycastle.operator.DigestCalculator;
30+
import org.bouncycastle.operator.OperatorCreationException;
31+
import org.bouncycastle.operator.bc.BcDigestCalculatorProvider;
32+
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
2233
import org.slf4j.Logger;
2334
import org.slf4j.LoggerFactory;
2435
import org.springframework.beans.factory.annotation.Value;
2536
import org.springframework.stereotype.Service;
2637

2738
import java.io.ByteArrayInputStream;
2839
import java.io.File;
29-
import java.io.FileInputStream;
3040
import java.io.FileOutputStream;
31-
import java.security.KeyFactory;
32-
import java.security.KeyStore;
33-
import java.security.PrivateKey;
34-
import java.security.SecureRandom;
41+
import java.math.BigInteger;
42+
import java.security.*;
3543
import java.security.cert.Certificate;
36-
import java.security.cert.CertificateFactory;
3744
import java.security.cert.X509Certificate;
45+
import java.security.spec.ECGenParameterSpec;
3846
import java.security.spec.PKCS8EncodedKeySpec;
47+
import java.time.Duration;
48+
import java.time.Instant;
3949
import java.util.Base64;
50+
import java.util.Date;
4051

4152
@Service
4253
public class GatewayKeystoreService {
@@ -57,35 +68,59 @@ public class GatewayKeystoreService {
5768
@Value("${gatewaykeystore.password}")
5869
private String password;
5970

60-
public void createSelfSigned() throws Exception {
61-
if (log.isInfoEnabled()) {
62-
log.info("***generateSelfSigned keys and cert - BEGIN***");
63-
}
64-
65-
SelfSignedCertificate selfSignedCertificate = new SelfSignedCertificate("eldix4kim.sberg.net", SecureRandom.getInstance("NativePRNG"), keysize);
71+
private SubjectKeyIdentifier createSubjectKeyId(final PublicKey publicKey) throws OperatorCreationException {
72+
final SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());
73+
final DigestCalculator digCalc =
74+
new BcDigestCalculatorProvider().get(new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1));
6675

67-
CertificateFactory fact = CertificateFactory.getInstance("X.509");
68-
FileInputStream is = new FileInputStream(selfSignedCertificate.certificate());
69-
X509Certificate cer = (X509Certificate) fact.generateCertificate(is);
70-
is.close();
76+
return new X509ExtensionUtils(digCalc).createSubjectKeyIdentifier(publicKeyInfo);
77+
}
7178

72-
Certificate[] chain = new Certificate[]{cer};
79+
private AuthorityKeyIdentifier createAuthorityKeyId(final PublicKey publicKey)
80+
throws OperatorCreationException
81+
{
82+
final SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(publicKey.getEncoded());
83+
final DigestCalculator digCalc =
84+
new BcDigestCalculatorProvider().get(new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1));
7385

74-
String privKeyContent = FileUtils.readFileContent(selfSignedCertificate.privateKey().getAbsolutePath());
75-
String privateKeyPEM = privKeyContent
76-
.replace(BEGIN_KEY, "")
77-
.replaceAll(System.lineSeparator(), "")
78-
.replace(END_KEY, "");
86+
return new X509ExtensionUtils(digCalc).createAuthorityKeyIdentifier(publicKeyInfo);
87+
}
7988

80-
byte[] encoded = Base64.getDecoder().decode(privateKeyPEM.getBytes("UTF-8"));
89+
public void createSelfSigned() throws Exception {
90+
if (log.isInfoEnabled()) {
91+
log.info("***generateSelfSigned keys and cert - BEGIN***");
92+
}
8193

82-
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(encoded);
83-
KeyFactory kf = KeyFactory.getInstance("RSA");
84-
PrivateKey privKey = kf.generatePrivate(spec);
94+
KeyPairGenerator kg = KeyPairGenerator.getInstance("EC", "BC");
95+
ECGenParameterSpec kpgparams = new ECGenParameterSpec("brainpoolP256r1");
96+
kg.initialize(kpgparams);
97+
98+
KeyPair keyPair = kg.generateKeyPair();
99+
100+
final Instant now = Instant.now();
101+
final Date notBefore = Date.from(now);
102+
final Date notAfter = Date.from(now.plus(Duration.ofDays(365)));
103+
final ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256withECDSA").build(keyPair.getPrivate());
104+
final X500Name x500Name = new X500Name("CN=" + "eldix4kim.sberg.net");
105+
106+
final X509v3CertificateBuilder certificateBuilder =
107+
new JcaX509v3CertificateBuilder(x500Name,
108+
BigInteger.valueOf(now.toEpochMilli()),
109+
notBefore,
110+
notAfter,
111+
x500Name,
112+
keyPair.getPublic())
113+
.addExtension(Extension.subjectKeyIdentifier, false, createSubjectKeyId(keyPair.getPublic()))
114+
.addExtension(Extension.authorityKeyIdentifier, false, createAuthorityKeyId(keyPair.getPublic()))
115+
.addExtension(Extension.basicConstraints, true, new BasicConstraints(true));
116+
117+
X509Certificate x509Certificate = new JcaX509CertificateConverter()
118+
.setProvider(new BouncyCastleProvider()).getCertificate(certificateBuilder.build(contentSigner));
119+
Certificate[] chain = new Certificate[]{x509Certificate};
85120

86121
KeyStore keyStore = KeyStore.getInstance("PKCS12", "BC");
87122
keyStore.load(null, null);
88-
keyStore.setKeyEntry(ICommonConstants.OPENKIM_SERVER_KEYSTORE_ALIAS, privKey, password.toCharArray(), chain);
123+
keyStore.setKeyEntry(ICommonConstants.OPENKIM_SERVER_KEYSTORE_ALIAS, keyPair.getPrivate(), password.toCharArray(), chain);
89124
keyStore.store(
90125
new FileOutputStream(new File(ICommonConstants.BASE_DIR + ICommonConstants.OPENKIM_SERVER_KEYSTORE_FILENAME)),
91126
password.toCharArray()

src/main/java/net/sberg/openkim/gateway/pop3/Pop3Gateway.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@ private Encryption buildSSLContext(Konfiguration konfiguration) throws Exception
121121
ks.load(fis, keyStorePwd.toCharArray());
122122

123123
// Set up key manager factory to use our key store
124-
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
124+
KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX", "BCJSSE");
125125
kmf.init(ks, keyStorePwd.toCharArray());
126126

127127
// Initialize the SSLContext to work with our key managers.
128-
SSLContext context = SSLContext.getInstance("TLS");
128+
SSLContext context = SSLContext.getInstance("TLS", "BCJSSE");
129129
context.init(kmf.getKeyManagers(), null, null);
130130
if (konfiguration.getPop3GatewayConnectionSec().equals(EnumMailConnectionSecurity.STARTTLS)) {
131131
encryption = Encryption.createStartTls(context, null, null, ClientAuth.NONE);
@@ -134,7 +134,11 @@ private Encryption buildSSLContext(Konfiguration konfiguration) throws Exception
134134
encryption = Encryption.createTls(context, null, null, ClientAuth.NONE);
135135
}
136136

137-
} finally {
137+
}
138+
catch (Exception e) {
139+
log.error("error on starting the pop3 gateway - bulding ssl context", e);
140+
}
141+
finally {
138142
if (fis != null) {
139143
fis.close();
140144
}

src/main/java/net/sberg/openkim/gateway/smtp/SmtpGateway.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ private Encryption buildSSLContext(Konfiguration konfiguration) throws Exception
124124
ks.load(fis, keyStorePwd.toCharArray());
125125

126126
// Set up key manager factory to use our key store
127-
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
127+
KeyManagerFactory kmf = KeyManagerFactory.getInstance("PKIX", "BCJSSE");
128128
kmf.init(ks, keyStorePwd.toCharArray());
129129

130130
// Initialize the SSLContext to work with our key managers.
131-
SSLContext context = SSLContext.getInstance("TLS");
131+
SSLContext context = SSLContext.getInstance("TLS", "BCJSSE");
132132
context.init(kmf.getKeyManagers(), null, null);
133133
if (konfiguration.getSmtpGatewayConnectionSec().equals(EnumMailConnectionSecurity.STARTTLS)) {
134134
encryption = Encryption.createStartTls(context, null, null, ClientAuth.NONE);
@@ -137,7 +137,11 @@ private Encryption buildSSLContext(Konfiguration konfiguration) throws Exception
137137
encryption = Encryption.createTls(context, null, null, ClientAuth.NONE);
138138
}
139139

140-
} finally {
140+
}
141+
catch (Exception e) {
142+
log.error("error on starting the smtp gateway - bulding ssl context", e);
143+
}
144+
finally {
141145
if (fis != null) {
142146
fis.close();
143147
}

src/main/java/net/sberg/openkim/gateway/smtp/hook/SmtpGatewayMailHook.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ public HookResult onMessage(SMTPSession session, MailEnvelope mailEnvelope) {
388388
smtpGatewaySession.log("mail hook ends");
389389
return HookResult.OK;
390390
} else {
391-
smtpGatewaySession.log("mail hook ends - error");
391+
smtpGatewaySession.log("mail hook ends on sendShortMessageData - "+smtpGatewaySession.getSmtpClient().getReplyCode()+" - "+smtpGatewaySession.getSmtpClient().getReplyString()+" - error");
392392
return HookResult.DENY;
393393
}
394394
} catch (Exception e) {

src/main/java/net/sberg/openkim/konfiguration/Konfiguration.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ public class Konfiguration {
6868
private MultipartFile fachdienstCertFile;
6969

7070
@JsonIgnore
71-
private String xkimCmVersion = "OpenKIM_0.17.0";
71+
private String xkimCmVersion = "OpenKIM_0.18.1";
7272
@JsonIgnore
73-
private String xkimPtVersion = "1.5.0-2";
73+
private String xkimPtVersion = "1.6.2-3";
7474
@JsonIgnore
75-
private EnumKomLeVersion xkimPtShortVersion = EnumKomLeVersion.V1_5plus;
75+
private EnumKomLeVersion xkimPtShortVersion = EnumKomLeVersion.V1_5;
7676

7777
private List<Konnektor> konnektoren = new ArrayList<>();
7878

src/main/java/net/sberg/openkim/pipeline/operation/mail/MailUtils.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,8 @@ public static final Session createPop3ClientSession(
369369
authMethod,
370370
host,
371371
port,
372-
pop3ClientIdleTimeoutInSeconds * 1000
372+
pop3ClientIdleTimeoutInSeconds * 1000,
373+
!createSSLSocketFactory
373374
);
374375

375376
if (createSSLSocketFactory) {
@@ -385,7 +386,8 @@ public static final Properties fillPop3MailProps(
385386
EnumMailAuthMethod authMethod,
386387
String host,
387388
String port,
388-
int timeout) throws Exception {
389+
int timeout,
390+
boolean trustAllHosts) throws Exception {
389391
if (connectionSecurity.equals(EnumMailConnectionSecurity.STARTTLS)) {
390392
props.put("mail.pop3.starttls.enable", "true");
391393
props.put("mail.pop3.ssl.enable", "false");
@@ -403,6 +405,10 @@ public static final Properties fillPop3MailProps(
403405
props.put("mail.pop3.auth", "false");
404406
}
405407

408+
if (trustAllHosts) {
409+
props.put("mail.pop3.ssl.trust", "*");
410+
}
411+
406412
props.put("mail.transport.protocol", "pop3");
407413
props.put("mail.store.protocol", "pop3");
408414
props.put("mail.pop3.host", host);
@@ -420,7 +426,8 @@ public static final Properties fillSmtpMailProps(
420426
EnumMailAuthMethod authMethod,
421427
String host,
422428
String port,
423-
int timeout) throws Exception {
429+
int timeout,
430+
boolean trustAllHosts) throws Exception {
424431
if (connectionSecurity.equals(EnumMailConnectionSecurity.STARTTLS)) {
425432
props.put("mail.smtp.starttls.enable", "true");
426433
props.put("mail.smtp.ssl.enable", "false");
@@ -442,7 +449,9 @@ else if (connectionSecurity.equals(EnumMailConnectionSecurity.NONE)) {
442449
}
443450

444451
props.put("mail.transport.protocol", "smtp");
445-
props.put("mail.smtp.ssl.trust", "*");
452+
if (trustAllHosts) {
453+
props.put("mail.smtp.ssl.trust", "*");
454+
}
446455
props.put("mail.smtp.host", host);
447456
props.put("mail.smtp.port", port);
448457
props.put("mail.smtp.connectiontimeout", timeout);

src/main/java/net/sberg/openkim/pipeline/operation/test/SendMailTestOperation.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ public void execute(DefaultPipelineOperationContext defaultPipelineOperationCont
9595
EnumMailAuthMethod.NORMALPWD,
9696
konfiguration.getGatewayHost(),
9797
konfiguration.getSmtpGatewayPort(),
98-
konfiguration.getSmtpGatewayIdleTimeoutInSeconds() * 1000
98+
konfiguration.getSmtpGatewayIdleTimeoutInSeconds() * 1000,
99+
true
99100
);
100101
Session session = Session.getInstance(props);
101102

0 commit comments

Comments
 (0)