【问题标题】:System.setProperty("javax.net.ssl.keyStore", xxx) not working in api rest?System.setProperty("javax.net.ssl.keyStore", xxx) 不在 api rest 中工作?
【发布时间】:2020-11-14 17:28:01
【问题描述】:

我有以下代码,如果我通过控制台运行它就可以正常工作

public static void main(String[] args) throws MalformedURLException {
    // TODO Auto-generated method stub
    try {
        String jSonData = "xxx";

        String nombreCertificadoTicket = "CERTIFICADO.p12";
        String passCertificadoTicket = "PASSWORD";
        String pathCertificado = "/opt/tomcat/properties/"+nombreCertificadoTicket;
        String url_crearTicket = "URL SERVICE";
        
        System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
        System.setProperty("javax.net.ssl.keyStore", pathCertificado);
        System.setProperty("javax.net.ssl.keyStorePassword", passCertificadoTicket);
        
        URL urlCrearTicket = new URL(url_crearTicket);                                                  
        
        HttpURLConnection conexionCrearTicket = (HttpURLConnection) urlCrearTicket.openConnection();
        conexionCrearTicket.setDoOutput(true);
        conexionCrearTicket.setRequestMethod("POST");
        conexionCrearTicket.setRequestProperty("content-type", "application/json");

        OutputStream os = conexionCrearTicket.getOutputStream();
        os.write(jSonData.getBytes());
        os.flush();
        
        System.out.println("CODE :"+conexionCrearTicket.getResponseCode());

我通过consol执行这个类,它执行并返回代码ok

但我将完全相同的代码放在休息服务中,它返回 401 未经授权的错误,因此我认为它没有正确放置安全证书

@Path("PruebaCertificado")
public class PruebaCertificado {

@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public RespuestaWs recibe(InputStream entrada) {
    
    RespuestaWs respuesta = new RespuestaWs();
    
    try {
        
        String jSonData = "";
        
        String jSonData = "xxx";

        String nombreCertificadoTicket = "CERTIFICADO.p12";
        String passCertificadoTicket = "PASSWORD";
        String pathCertificado = "/opt/tomcat/properties/"+nombreCertificadoTicket;
        String url_crearTicket = "URL SERVICE";
        
        System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
        System.setProperty("javax.net.ssl.keyStore", pathCertificado);
        System.setProperty("javax.net.ssl.keyStorePassword", passCertificadoTicket);
        
        URL urlCrearTicket = new URL(url_crearTicket);                                                  
        
        HttpURLConnection conexionCrearTicket = (HttpURLConnection) urlCrearTicket.openConnection();
        conexionCrearTicket.setDoOutput(true);
        conexionCrearTicket.setRequestMethod("POST");
        conexionCrearTicket.setRequestProperty("content-type", "application/json");

        OutputStream os = conexionCrearTicket.getOutputStream();
        os.write(jSonData.getBytes());
        os.flush();
        
        System.out.println("CODE :"+conexionCrearTicket.getResponseCode());

我需要在 tomcat 中进行一些配置吗?

环境有 apache tomcat 8 y java 1.8

【问题讨论】:

  • 尝试把它放在一个带有@Configuration注解的类中。但我认为最好将 HttpUrlConnection 与 SSLContext 一起使用并在那里设置您的密钥库而不是设置属性。

标签: java api rest


【解决方案1】:

我用我找到的另一个代码解决了它,我留下它以防它适用于某人。注意我使用 HttpsURLConnection

        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        InputStream keyInput = new FileInputStream(pathCertificado);
        keyStore.load(keyInput, passCertificadoTicket.toCharArray());
        keyInput.close();
        keyManagerFactory.init(keyStore, passCertificadoTicket.toCharArray());
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());
        
        HttpsURLConnection conexionCrearTicket = (HttpsURLConnection) urlCrearTicket.openConnection();
        conexionCrearTicket.setSSLSocketFactory(context.getSocketFactory());
        conexionCrearTicket.setDoOutput(true);
        conexionCrearTicket.setRequestMethod("POST");
        conexionCrearTicket.setRequestProperty("content-type", "application/json");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2017-03-12
    • 2020-08-18
    • 1970-01-01
    • 2012-01-28
    • 2021-10-18
    相关资源
    最近更新 更多