Skip to content

Commit 3d33949

Browse files
committed
Apply the proxy settings before accessing the cloud signing services (Fixes #324)
1 parent c7e34de commit 3d33949

File tree

6 files changed

+64
-8
lines changed

6 files changed

+64
-8
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ See https://ebourg.github.io/jsign for more information.
6868

6969
* Multiple signatures are now supported for EFI files
7070
* Self-signed certificates are no longer removed from the certificate store embedded in the signature (contributed by Christian Renz)
71+
* The proxy settings are now applied to the connections to the cloud signing services
7172
* API changes:
7273
* New `Signable.setSignatures(List<CMSSignedData>)` method to set multiple signatures (nesting is handled automatically)
7374
* `SignatureUtils.getSignatures()` now removes the nested signatures from the first signature in the list

jsign-cli/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@
4040
<version>2.0.22</version> <!-- last version supporting Java 8 -->
4141
<scope>test</scope>
4242
</dependency>
43+
44+
<dependency>
45+
<groupId>net.jadler</groupId>
46+
<artifactId>jadler-all</artifactId>
47+
<version>1.3.1</version>
48+
<scope>test</scope>
49+
</dependency>
4350
</dependencies>
4451

4552
<build>

jsign-cli/src/test/java/net/jsign/JsignCLITest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.io.File;
2020
import java.io.FileOutputStream;
21+
import java.io.FileReader;
2122
import java.net.ProxySelector;
2223
import java.nio.charset.StandardCharsets;
2324
import java.nio.file.Files;
@@ -28,6 +29,7 @@
2829
import java.util.concurrent.atomic.AtomicBoolean;
2930

3031
import io.netty.handler.codec.http.HttpRequest;
32+
import net.jadler.Jadler;
3133
import org.apache.commons.cli.ParseException;
3234
import org.apache.commons.io.ByteOrderMark;
3335
import org.apache.commons.io.FileUtils;
@@ -481,6 +483,52 @@ public String getRealm() {
481483
}
482484
}
483485

486+
@Test
487+
public void testSigningWithProxy() throws Exception {
488+
Jadler.initJadler().withDefaultResponseStatus(404);
489+
Jadler.onRequest()
490+
.havingMethodEqualTo("GET")
491+
.havingPathEqualTo("/certificates/test1")
492+
.havingHeaderEqualTo("Via", "1.1 JsignProxy")
493+
.respond()
494+
.withStatus(200)
495+
.withBody(IOUtils.toString(new FileReader("../jsign-crypto/src/test/resources/services/azure-certificate.json")).replaceAll("https://jsigntestkeyvault.vault.azure.net", "http://localhost:" + Jadler.port()));
496+
497+
Jadler.onRequest()
498+
.havingMethodEqualTo("POST")
499+
.havingPathEqualTo("/keys/test1/38ca3e3560b94086ac604c5dd21aa055/sign")
500+
.havingHeaderEqualTo("Via", "1.1 JsignProxy")
501+
.havingBodyEqualTo("{\"alg\":\"RS256\",\"value\":\"kSBZhCngz7tfmw+l3j1W5vHMMcGYvpijTm++fl8zANY=\"}")
502+
.respond()
503+
.withStatus(200)
504+
.withBody("{\"kid\":\"https://jsigntestkeyvault.vault.azure.net/keys/test1/38ca3e3560b94086ac604c5dd21aa055\",\"value\":\"CzDTijE0vOEDJTzbzhaMuF5mN-yO59DI5DaA35U8Rldj1mwwmHvH2yyLn2UA_dn2U5KjjmI5CXjf_gWa_-WZDmTxr6w-yNRUlJ4TJZBUF7tdi5MI70maZgcY3MGkXzWeAxXiKf57ZLMfJWLNGxXMrMQRJDi6XlDfmwIApxK-0gsUlZhq2GjlBZWGf7IPBr1Mk6ZeOUfPzFTrPXgFs5CBS5FMYGuujePGjVDRY-ODbs2l9JpQW-wv6lRX0bFXgzn4LwVqHOM_P-_kxBLbIV37hfnBnV_uYF3aDEYkE3I-wni8JPRr3hFsqRY5wea_HzzropDD1zQ5TNLJXdbLro0S7A\"}");
505+
506+
HttpProxyServer proxy = DefaultHttpProxyServer.bootstrap()
507+
.withPort(12543)
508+
.withProxyAlias("JsignProxy")
509+
.start();
510+
511+
try {
512+
File targetFile2 = new File("target/test-classes/wineyes-signed-with-cli-proxy.exe");
513+
FileUtils.copyFile(sourceFile, targetFile2);
514+
cli.execute("--storetype=AZUREKEYVAULT",
515+
"--keystore=http://localhost:" + Jadler.port(),
516+
"--storepass=token",
517+
"--alias=test1",
518+
"--proxyUrl=localhost:" + proxy.getListenAddress().getPort(),
519+
"" + targetFile2);
520+
521+
assertTrue("The file " + targetFile2 + " wasn't changed", SOURCE_FILE_CRC32 != FileUtils.checksumCRC32(targetFile2));
522+
523+
try (PEFile peFile = new PEFile(targetFile2)) {
524+
SignatureAssert.assertSigned(peFile, SHA256);
525+
}
526+
} finally {
527+
proxy.stop();
528+
Jadler.closeJadler();
529+
}
530+
}
531+
484532
@Test
485533
public void testReplaceSignature() throws Exception {
486534
File targetFile2 = new File("target/test-classes/wineyes-re-signed.exe");

jsign-core/src/main/java/net/jsign/SignerHelper.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,12 @@ public void execute(File file) throws SignerException {
342342
}
343343

344344
private AuthenticodeSigner build() throws SignerException {
345+
try {
346+
initializeProxy(proxyUrl, proxyUser, proxyPass);
347+
} catch (Exception e) {
348+
throw new SignerException("Couldn't initialize proxy", e);
349+
}
350+
345351
KeyStore ks;
346352
try {
347353
ks = ksparams.build();
@@ -416,12 +422,6 @@ private AuthenticodeSigner build() throws SignerException {
416422
throw new SignerException("The digest algorithm " + alg + " is not supported");
417423
}
418424

419-
try {
420-
initializeProxy(proxyUrl, proxyUser, proxyPass);
421-
} catch (Exception e) {
422-
throw new SignerException("Couldn't initialize proxy", e);
423-
}
424-
425425
// enable timestamping with Azure Trusted Signing
426426
if (tsaurl == null && storetype == KeyStoreType.TRUSTEDSIGNING) {
427427
tsaurl = "http://timestamp.acs.microsoft.com/";

jsign-crypto/src/test/java/net/jsign/jca/AzureKeyVaultSigningServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public void testGetCertificateChain() throws Exception {
118118
Certificate[] chain = service.getCertificateChain("test1");
119119
assertNotNull("chain", chain);
120120
assertEquals("number of certificates", 1, chain.length);
121-
assertEquals("subject name", "CN=Jsign Test Certificate", ((X509Certificate) chain[0]).getSubjectDN().getName());
121+
assertEquals("subject name", "CN=Jsign Code Signing Test Certificate 2024 (RSA)", ((X509Certificate) chain[0]).getSubjectDN().getName());
122122

123123
// check if the certificate is cached
124124
Certificate[] chain2 = service.getCertificateChain("test1");

jsign-crypto/src/test/resources/services/azure-certificate.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"kid": "https://jsigntestkeyvault.vault.azure.net/keys/test1/38ca3e3560b94086ac604c5dd21aa055",
44
"sid": "https://jsigntestkeyvault.vault.azure.net/secrets/test1/38ca3e3560b94086ac604c5dd21aa055",
55
"x5t": "v0sWC5lKV5G4k4UdqPWBo1PhBqs",
6-
"cer": "MIIDSDCCAjCgAwIBAgIQI+1K7AuPQaOHuA2AcfOx1zANBgkqhkiG9w0BAQsFADAhMR8wHQYDVQQDExZKc2lnbiBUZXN0IENlcnRpZmljYXRlMB4XDTIxMDYxMjA4MjcwOVoXDTIyMDYxMjA4MzcwOVowITEfMB0GA1UEAxMWSnNpZ24gVGVzdCBDZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK+hb3oSz3Dmpsua/hdchodcxPVoC0Edc3yyYeXPyU15eZJggxmKFSbtuhhuMSCnyy/U5IdkwGL1Itb9Z0JkNbCuz0Qoj2US3lO1zG6BWLYATQzLI0P8gcC77MRFTolkCs8Db4zF/fm7887XjlnBIDKxxSaSFxXKMCRnnYkS71IxrmhcEI8UO9jaP6c5aux61nPEqn/eO64WEYp5FkjHrsmKz9T98MijLorMSCKnClniGBpJDOMy2koLNuWjYhjU5dwBcP0EaydZWm8ithVxQNgxFQTeaNf4q4kwZggULSlaIst9zLlXz1DDQSPrTJNIHs3TataFehpVpaezb+b4bPECAwEAAaN8MHowDgYDVR0PAQH/BAQDAgWgMAkGA1UdEwQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB8GA1UdIwQYMBaAFPdrIYZz5JtpoVDDU9rGMSNHwjkEMB0GA1UdDgQWBBT3ayGGc+SbaaFQw1PaxjEjR8I5BDANBgkqhkiG9w0BAQsFAAOCAQEAHDS/9U5nYwnDDEZ5V0wSNnGSfO5MuOINeD/5qiQx7v4K+6mvx+tX9cKRaNsf7zHv6lEcuuwZgGS61dyl3RItKURrGQxpAk07oEEuNgj+8EcShfwZ7Flufk1DGaawYklBCY7JNvUctUqOGeZ56Vy94r42rleh2w9FPWcoA7ZypnYq1Z7aM6AWQwQ7AJuPxrp49ATBQFUTG17QrVh8EX8b3gG6D/IV3WhrFr9BX3DOcACdgKT82oLyTfFQOZRxM4hZzhLlBQWu5oBe1ZcGGhhz3GwIFSScuxxCJkA9FiiU31COaW/4Zmj86JM/sHzO9ntn9UKqpbB7bI964v8EKPo/Pg==",
6+
"cer": "MIID9zCCAt+gAwIBAgIUIyrnR0Owrk2nS+rhU4dkSvbKegMwDQYJKoZIhvcNAQELBQAwJTEjMCEGA1UEAwwaSnNpZ24gQ29kZSBTaWduaW5nIENBIDIwMjQwHhcNMjQwNTEwMTMwODIwWhcNNDQwNTEwMTMwODIwWjA5MTcwNQYDVQQDDC5Kc2lnbiBDb2RlIFNpZ25pbmcgVGVzdCBDZXJ0aWZpY2F0ZSAyMDI0IChSU0EpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAppBS5ZCsecfKOR2HBZ2pP5bSD23q9OdCZTjL9emDnCwXU1EyHa6MuPs9DH76Xt9knHe8LUknX9EzoJUUFi5rMvB8OOXj82PieCWK36KM4m1ecHFIYikplNo5HD1phwwi8dGLFkWqlUh8DQjuCMQH9aQjoer54+7RkYA2iuCAnH9A/kiEE/MpKa/7zdxAD3ngk3wSN3K4zNWzZKo7KBRso1qLiOWaK0RTIoH/b2T2mj732kncpRB74EeWLd/IQU3NR0/2cHoVTD72Sjjz8LSruop6sqSdhbfKxnAPvRYx3jRr/hTVwAFIVtW/IhUBrh3FGhyjnYaS37HUaE4LO0u1DwIDAQABo4IBCTCCAQUwCQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHQYDVR0OBBYEFBLEig5vFkfxsh/Oey8w5icoMTSTMB8GA1UdIwQYMBaAFOJxSqNT6Vgqe5REPTuuigHU5QT9MIGVBggrBgEFBQcBAQSBiDCBhTCBggYIKwYBBQUHMAKGdmh0dHA6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vib3VyZy9qc2lnbi9tYXN0ZXIvanNpZ24tY29yZS9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVzL2pzaWduLWNvZGUtc2lnbmluZy1jYS5jZXIwDQYJKoZIhvcNAQELBQADggEBADX+jVZK5h+GrFNpM1LtjIxOaBSMTJpByreAGswx6sU0tMrdKRmSJwA48qahbKH2Xwl/dMBfOEbHIfqqW8tXJ6NTIqaAw2Tn0kUPH6bzy7vLXOhR1fIdrEsAVyR3dk19Du2IJa44rB0qrVWIXsVVPSWj3PeOj3MocPh1jFMnA83ZY2/lJSOJ6BByILtTPuiUckfB6K1y/f4KMAh67esxF9jYE2s0mqtxqNN9HSASfcf2Cw6hnTx5p5VwbOiP5Z3C42Fy9tjNt9ccb6PaP1yn72tQSfZC4XcRmbiQauhjph4Qop1t1urU1gdlF8gD2vDdNaIgKIX2Hnj1eZNP5R9VC08=",
77
"attributes": {
88
"enabled": true,
99
"nbf": 1623486429,

0 commit comments

Comments
 (0)