Skip to content

Commit 5383eb7

Browse files
Merge pull request #65 from xdev-software/accept-multiple-certs
Accept multiple certs
2 parents 2e7c502 + 7509e1e commit 5383eb7

30 files changed

+1024
-268
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
* Now supports the CESOP-Format (and the DAC7-Format).
44
* Uses a client that is auto generated by OpenAPI. This makes the library more robust for future changes of the API.
5+
* Certificates can now be defined with a ``SigningProvider``.
56

67
# 1.0.3
78

README.md

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,32 @@ Our library validates each request through these XSD find errors before they are
4040

4141
See the [examples in the demo package](./bzst-dip-java-client-demo/src/main/java/software/xdev/).
4242

43-
### Create keystore file
43+
### Create certificate
4444

4545
For authentification at the BZST you have to create a public- and private-key.
4646

4747
First you have to create a **PEM** file as described on the [BZST Website](https://www.bzst.de/DE/Service/Portalinformation/Massendaten/DIP/dip_node.html) (see 1.7).
4848

49-
OpenSSL can be downloaded from their [website](https://www.openssl.org/).
49+
OpenSSL can be downloaded from the [website](https://www.openssl.org/).
5050

5151
```
5252
openssl req -newkey rsa-pss -new -nodes -x509 -days 3650 -pkeyopt rsa_keygen_bits:4096 -sigopt rsa_pss_saltlen:32 -keyout key.pem -out cert.pem
5353
```
5454

55-
Next you have to convert that file to a **PKCS12** file.
55+
You also have to set the public key in the [BZST online.portal](https://online.portal.bzst.de/).
56+
Exporting the public key with OpenSSL is easy:
57+
58+
```
59+
openssl rsa -in key.pem -pubout > publicKey.pub
60+
```
61+
62+
Now you can already use these two files to sign your requests. See
63+
the [example with PEM signing](./bzst-dip-java-client-demo\src\main\java\software\xdev\ApplicationWithPem.java).
64+
65+
### Create Java KeyStore (JKS)
66+
67+
If you want to go one step further you can use the Java KeyStore. Then you have to convert the `cert.pem` file to a *
68+
*PKCS12** file.
5669

5770
```
5871
openssl pkcs12 -export -in cert.pem -inkey key.pem -out certificate.p12 -name "certificate"
@@ -71,13 +84,6 @@ certificate.keystore.password=SECRET_PASSWORD
7184
certificate.keystore.file=cert.jks
7285
```
7386

74-
You also have to set the public key in the [BZST online.portal](https://online.portal.bzst.de/).
75-
Exporting the public key with OpenSSL is easy:
76-
77-
```
78-
openssl rsa -in key.pem -pubout > publicKey.pub
79-
```
80-
8187
### Client ID
8288

8389
It's also important to use the client id provided by [BZST online.portal](https://online.portal.bzst.de/)
@@ -99,9 +105,7 @@ public static BzstDipConfiguration createConfiguration()
99105
.setClientId("abcd1234-ab12-ab12-ab12-abcdef123456")
100106
.setTaxID("86095742719")
101107
.setTaxNumber("123")
102-
.setCertificateKeystoreInputStream(() -> ClassLoader.getSystemClassLoader()
103-
.getResourceAsStream("DemoKeystore.jks"))
104-
.setCertificateKeystorePassword("test123")
108+
.setSigningProvider(new SigningProviderByJks("DemoKeystore.jks", "test123"))
105109
.setRealmEnvironmentBaseUrl(BzstDipConfiguration.ENDPOINT_URL_TEST)
106110
.setMessageTypeIndic(BzstDipDpiMessageType.DPI_401)
107111
.setReportingPeriod(LocalDate.now())

bzst-dip-java-client-demo/src/main/java/software/xdev/ApplicationWithCesop.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipCompleteResult;
4949
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipCountryCode;
5050
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipCurrency;
51+
import software.xdev.bzst.dip.client.signing.SigningProviderByJks;
5152

5253

5354
@SuppressWarnings("checkstyle:MagicNumber")
@@ -75,8 +76,7 @@ public static BzstDipConfiguration createConfiguration()
7576
.setClientId("abcd1234-ab12-ab12-ab12-abcdef123456")
7677
.setTaxID("86095742719")
7778
.setTaxNumber("123")
78-
.setCertificateKeystoreInputStream(() -> ClassLoader.getSystemClassLoader()
79-
.getResourceAsStream("DemoKeystore.jks"))
79+
.setSigningProvider(new SigningProviderByJks("DemoKeystore.jks", "test123"))
8080
.setCertificateKeystorePassword("test123")
8181
.setRealmEnvironmentBaseUrl(BzstDipConfiguration.ENDPOINT_URL_TEST)
8282
.setMessageTypeIndicCesop(BzstCesopMessageTypeIndicEnum.CESOP_101)

bzst-dip-java-client-demo/src/main/java/software/xdev/ApplicationWithDac7.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipOecdLegalAddressType;
2727
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipTaxes;
2828
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipTin;
29+
import software.xdev.bzst.dip.client.signing.SigningProviderByJks;
2930

3031

3132
@SuppressWarnings("checkstyle:MagicNumber")
@@ -53,9 +54,7 @@ public static BzstDipConfiguration createConfiguration()
5354
.setClientId("abcd1234-ab12-ab12-ab12-abcdef123456")
5455
.setTaxID("86095742719")
5556
.setTaxNumber("123")
56-
.setCertificateKeystoreInputStream(() -> ClassLoader.getSystemClassLoader()
57-
.getResourceAsStream("DemoKeystore.jks"))
58-
.setCertificateKeystorePassword("test123")
57+
.setSigningProvider(new SigningProviderByJks("DemoKeystore.jks", "test123"))
5958
.setRealmEnvironmentBaseUrl(BzstDipConfiguration.ENDPOINT_URL_TEST)
6059
.setMessageTypeIndic(BzstDipDpiMessageType.DPI_401)
6160
.setReportingPeriod(LocalDate.now())
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package software.xdev;
2+
3+
import java.io.IOException;
4+
import java.time.LocalDate;
5+
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
import software.xdev.bzst.dip.client.BzstDipClient;
10+
import software.xdev.bzst.dip.client.model.configuration.BzstDipConfiguration;
11+
import software.xdev.bzst.dip.client.model.configuration.BzstDipConfigurationBuilder;
12+
import software.xdev.bzst.dip.client.model.configuration.BzstDipDpiMessageType;
13+
import software.xdev.bzst.dip.client.model.configuration.BzstDipOecdDocType;
14+
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipAddressFix;
15+
import software.xdev.bzst.dip.client.model.message.dac7.BzstDipCompleteResult;
16+
import software.xdev.bzst.dip.client.signing.SigningProviderByPem;
17+
18+
19+
@SuppressWarnings("checkstyle:MagicNumber")
20+
public final class ApplicationWithPem
21+
{
22+
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationWithPem.class);
23+
24+
public static void main(final String[] args)
25+
throws InterruptedException, IOException
26+
{
27+
final BzstDipConfiguration configuration = createConfiguration();
28+
final BzstDipClient bzstDipClient = new BzstDipClient(configuration);
29+
final BzstDipCompleteResult bzstDipCompleteResult =
30+
bzstDipClient.sendDipAndQueryResult(ApplicationWithDac7.createMessage());
31+
LOGGER.info(
32+
"Sending dip message with transfer number {} {}",
33+
bzstDipCompleteResult.dataTransferNumber(),
34+
bzstDipCompleteResult.isSuccessful() ? "was successful." : "has failed!"
35+
);
36+
}
37+
38+
public static BzstDipConfiguration createConfiguration()
39+
{
40+
return new BzstDipConfigurationBuilder()
41+
.setClientId("abcd1234-ab12-ab12-ab12-abcdef123456")
42+
.setTaxID("86095742719")
43+
.setTaxNumber("123")
44+
.setSigningProvider(new SigningProviderByPem("DemoCert.pem", "DemoKey.pem"))
45+
.setRealmEnvironmentBaseUrl(BzstDipConfiguration.ENDPOINT_URL_TEST)
46+
.setMessageTypeIndic(BzstDipDpiMessageType.DPI_401)
47+
.setReportingPeriod(LocalDate.now())
48+
.setDocTypeIndic(BzstDipOecdDocType.OECD_1)
49+
.setPlatformOperatorOrganizationName("TestOrg")
50+
.setPlatformOperatorPlatformName("TestApp")
51+
.setPlatformOperatorAddress(new BzstDipAddressFix("TestCity"))
52+
.buildAndValidate();
53+
}
54+
55+
private ApplicationWithPem()
56+
{
57+
}
58+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
-----BEGIN CERTIFICATE-----
2+
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
34+
0IGQKyqO/74AsAKW8tlozi8=
35+
-----END CERTIFICATE-----
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
-----BEGIN PRIVATE KEY-----
2+
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
38+
Exvm1NhYCJ7gHXkC+fb5NMbY3UwstJrcX4bwlbWTLt+F3lKzMvPqGcvrdRMcvsrR
39+
LtNRoUtAN2upTq17gqsWhLbvOSVJ91pyhpvGHr2swndNhOtCJf6mt/myWG7Kiy11
40+
FBVDvRBxLws/Qwzoli/Jz/+O40LbSlZP8xP6QwKCAQEAw840WyyLo4Ce4v/3ZvFK
41+
LAp8/Yksy2IeX0uFu0P/Ms80bpP73CU91moTlrPmBMs25rL3mVW/FfrpfVMIVWJc
42+
Z96U60lauU1TXyKeqxMOvxD2c6tTmnDJOU7rZe3/kqiOwez6/m3va7FWI+7Wu9Aq
43+
gmLnkCy72MPZxL5nnLNqG3E3Xqg85RZKJb25tZFuJ9v9N2y17ePsNrlb74XrZ5z3
44+
qkDOPuOa/0vtv18NKfJE2NNpLVGYhYJpZZgA1eulLgTYIFSLipKpymPw31/pC8nU
45+
2m1jl6pD7IhnnVByTHROLyIKkBPvQItxFwzyhVNWjQzg5UOgyKGy22W5M/OoN8gU
46+
CQKCAQAnN6tA6ztx3fOfyordmZosOCjqX3PgMDrqz0327aUeUYK2YDiKwFf3DNkn
47+
r5pb03QJY6kad+8IIB1Kr6ezdJ7I1p23XSZtwQVvVwx189haWmMbKALJiKgDyk6A
48+
tyUahcDtwtXnXamesP+b4dZHSkEOeLvfXoBHwQPKE2m6Ubdes2ll2nFN50/h7kNe
49+
alVMsSOYeo4sr669gWyPk5iX1S1bRvpI/S+G9qTV/bp1piuzibzqwAhoNER6J1ue
50+
i0ZmGEHbj5paULxhol2BPUrTaW2VSlFyiQiJ/000c3eJvmhAr75tFPWmXowhiOC+
51+
zoafrCyAHLoMLdwpXQzSl212U04/
52+
-----END PRIVATE KEY-----
48 Bytes
Binary file not shown.

bzst-dip-java-client-demo/src/main/resources/app.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ application.code=
88
message.type=DPI402
99
reporting.period=2023-12-31
1010
doc.type=OECD2
11-
certificate.keystore.password=test123
12-
certificate.keystore.file=DemoKeystore.jks
11+
signing.jks.keystore.password=test123
12+
signing.jks.keystore.file=DemoKeystore.jks
1313

1414
delay.before.checking.results.in.millis=
1515
retry.query.results.amount=

bzst-dip-java-client/pom.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<sonar.exclusions>
5858
src/generated/**
5959
</sonar.exclusions>
60+
<junit-jupiter.version>5.10.2</junit-jupiter.version>
6061
</properties>
6162

6263
<repositories>
@@ -149,13 +150,13 @@
149150
<dependency>
150151
<groupId>org.junit.jupiter</groupId>
151152
<artifactId>junit-jupiter-api</artifactId>
152-
<version>5.10.3</version>
153+
<version>${junit-jupiter.version}</version>
153154
<scope>test</scope>
154155
</dependency>
155156
<dependency>
156157
<groupId>org.junit.jupiter</groupId>
157158
<artifactId>junit-jupiter-params</artifactId>
158-
<version>5.10.3</version>
159+
<version>${junit-jupiter.version}</version>
159160
<scope>test</scope>
160161
</dependency>
161162
<dependency>

0 commit comments

Comments
 (0)