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 é o KeyStore.PrivateKeyEntry existente. Forneça os valores da conta de proxy a partir da origem de credenciais do aplicativo e depois use este assinador no seu fluxo habitual de ZipFile e fluxo de saída.

O predicado do tipo de solicitante mantém a autenticação do proxy e do destino separadas, impedindo que um desafio do destino receba a senha do proxy; o host e a porta restringem o intermediário.

As propriedades do sistema e o Authenticator padrão afetam toda a JVM. Defina o tempo de vida delas na inicialização em vez de alterná-las em torno de tarefas simultâneas.

A API pública jdk.security.jarsigner evita sun.security.tools.jarsigner.Main e os layouts antigos de tools.jar. O exemplo usa TSA via HTTP; o TSA via HTTPS também precisa da sua rota HTTPS e da política habitual de verificação e autenticação.

Artigos relacionados