System.setProperty("http.proxyHost", "proxy.example");
System.setProperty("http.proxyPort", "8080");

java.net.Authenticator.setDefault(new java.net.Authenticator() {
    @Override
    protected java.net.PasswordAuthentication getPasswordAuthentication() {
        if (getRequestorType() == RequestorType.PROXY
                && "proxy.example".equalsIgnoreCase(getRequestingHost())
                && getRequestingPort() == 8080) {
            return new java.net.PasswordAuthentication(
                proxyUser, proxyPassword.toCharArray());
        }
        return null;
    }
});

var signer = new jdk.security.jarsigner.JarSigner.Builder(signingEntry)
    .tsa(java.net.URI.create("http://tsa.example/"))
    .build();

signingEntry è il KeyStore.PrivateKeyEntry esistente. Fornite i valori dell'account proxy dall'origine delle credenziali dell'applicazione, poi usate questo firmatario nel suo normale flusso di lavoro ZipFile e flusso di output.

Il predicato del tipo di richiedente mantiene separati l'autenticazione del proxy e della destinazione e impedisce a una sfida della destinazione di ricevere la password del proxy; host e porta limitano l'intermediario.

Le proprietà di sistema e l'Authenticator predefinito influiscono sull'intera JVM. Impostatene la durata all'avvio invece di scambiarle attorno a lavori concorrenti.

L'API pubblica jdk.security.jarsigner evita sun.security.tools.jarsigner.Main e le vecchie disposizioni tools.jar. L'esempio usa TSA HTTP; anche TSA HTTPS richiede la sua rotta HTTPS e la consueta politica di verifica e autenticazione.

Articoli correlati