Author: tilman
Date: Wed Aug 19 10:27:20 2026
New Revision: 1937225
Log:
PDFBOX-5660: add allowlist
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/SigUtils.java
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/CRLVerifier.java
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/OcspHelper.java
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/SigUtils.java
==============================================================================
---
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/SigUtils.java
Wed Aug 19 10:27:15 2026 (r1937224)
+++
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/SigUtils.java
Wed Aug 19 10:27:20 2026 (r1937225)
@@ -75,6 +75,26 @@ public class SigUtils
{
private static final Logger LOG = LogManager.getLogger(SigUtils.class);
+ // Certificates / CRLs / LDAP needed for our unit tests; add yours
+ // or create your own logic in checkAccess()
+ private static final Set<String> allowUrlSet =
+ Set.of("http://www.pki.admin.ch/aia/RegularCA01.crt",
+ "http://www.pki.admin.ch/aia/RootCAII.crt",
+ "http://www.pki.admin.ch/aia/RootCAIV.crt",
+ "http://www.pki.admin.ch/crl/RegularCA01.crl",
+ "http://www.pki.admin.ch/crl/RootCAII.crl",
+ "http://www.pki.admin.ch/aia/RegulatedCA02.crt",
+ "http://www.pki.admin.ch/aia/ocsp",
+ "http://www.pki.admin.ch/crl/RegulatedCA02.crl",
+ "http://repository.certum.pl/ctnca2.cer",
+ "http://repository.certum.pl/ctnca.cer",
+ "http://subca.repository.certum.pl/ctsca2021.cer",
+ "http://crl.geotrust.com/crls/adobeca1.crl",
+ "http://crl.adobe.com/cds.crl",
+ "http://subca.crl.certum.pl/ctsca2021.crl",
+ "http://subca.ocsp-certum.com",
+ "http://crl.certum.pl/ctnca2.crl");
+
private SigUtils()
{
}
@@ -423,6 +443,22 @@ public class SigUtils
}
}
}
+
+ /**
+ * A simple but very restrictive access control logic.
+ * <p>
+ * Create your own but use a zero-trust mindset.
+ *
+ * @param uri
+ * @throws IOException
+ */
+ public static void checkAccess(URI uri) throws IOException
+ {
+ if (!allowUrlSet.contains(uri.toString()))
+ {
+ throw new IOException("URL '" + uri + "' not in allowUrlSet");
+ }
+ }
/**
* Like {@link URL#openStream()} but will follow redirection from http to
https.
@@ -434,12 +470,15 @@ public class SigUtils
*/
public static InputStream openURL(String urlString) throws IOException,
URISyntaxException
{
- URL url = new URI(urlString).toURL();
- if (!url.getProtocol().startsWith("http"))
+ URI uri = new URI(urlString);
+ if (!uri.getScheme().startsWith("http"))
{
- throw new IOException(url.getProtocol() + " protocol not
supported");
+ throw new IOException(uri.getScheme() + " schema not supported");
}
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
+
+ checkAccess(uri);
+
+ HttpURLConnection con = (HttpURLConnection)
uri.toURL().openConnection();
int responseCode = con.getResponseCode();
LOG.info("{} {}", responseCode, con.getResponseMessage());
if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP ||
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/CRLVerifier.java
==============================================================================
---
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/CRLVerifier.java
Wed Aug 19 10:27:15 2026 (r1937224)
+++
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/CRLVerifier.java
Wed Aug 19 10:27:20 2026 (r1937225)
@@ -22,10 +22,9 @@ package org.apache.pdfbox.examples.signa
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
-import java.security.cert.CRLException;
-import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509CRL;
import java.security.cert.X509CRLEntry;
@@ -258,12 +257,12 @@ public final class CRLVerifier
* Downloads a CRL from given LDAP url, e.g.
* ldap://ldap.infonotary.com/dc=identity-ca,dc=infonotary,dc=com
*/
- private static X509CRL downloadCRLFromLDAP(String ldapURL) throws
CertificateException,
- NamingException, CRLException,
- CertificateVerificationException
+ private static X509CRL downloadCRLFromLDAP(String ldapURL) throws
GeneralSecurityException,
+ NamingException, CertificateVerificationException,
URISyntaxException, IOException
{
@SuppressWarnings({"squid:S1149"})
Hashtable<String, String> env = new Hashtable<>();
+ SigUtils.checkAccess(new URI(ldapURL));
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapURL);
Modified:
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/OcspHelper.java
==============================================================================
---
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/OcspHelper.java
Wed Aug 19 10:27:15 2026 (r1937224)
+++
pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/signature/cert/OcspHelper.java
Wed Aug 19 10:27:20 2026 (r1937225)
@@ -23,7 +23,6 @@ import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
-import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -461,8 +460,9 @@ public class OcspHelper
throws IOException, OCSPException, URISyntaxException
{
OCSPReq request = generateOCSPRequest();
- URL url = new URI(urlString).toURL();
- HttpURLConnection httpConnection = (HttpURLConnection)
url.openConnection();
+ URI uri = new URI(urlString);
+ SigUtils.checkAccess(uri);
+ HttpURLConnection httpConnection = (HttpURLConnection)
uri.toURL().openConnection();
try
{
httpConnection.setRequestProperty("Content-Type",
"application/ocsp-request");