如何在Nginx和tomcat中使用受信任的证书?

时间:2018-11-22 06:42:44

标签: java tomcat nginx jks httpsurlconnection

我正在将商家与我们的应用程序集成在一起。商家向我们提供了JKS,KEY,PEM和P12文件以及证书密码。

在开发服务器中,集成与JKS证书和使用HttpsURLConnection实现的证书密码一起使用。

SSLContext sc = SSLContext.getInstance("TLSv1.2"); KeyManagerFactory kmf; KeyStore ks; char[] passphrase = keystore_password.toCharArray(); kmf = KeyManagerFactory.getInstance("SunX509"); ks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream(keystore_path), passphrase); kmf.init(ks, passphrase); sc.init(kmf.getKeyManagers(), trustAllCerts, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); HostnameVerifier hv = new HostnameVerifier() {

        @Override
        public boolean verify(String urlHostName, SSLSession session) {
            if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                logger.warn("Warning: URL host ' " + urlHostName + " ' is different to SSLSession host ' "
                        + urlHostName + " '");
            }
            return true;
        }
    };

@Override public boolean verify(String urlHostName, SSLSession session) { if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) { logger.warn("Warning: URL host ' " + urlHostName + " ' is different to SSLSession host ' " + urlHostName + " '"); } return true; } };

在上层环境中,TOMCAT位于DMZ区域,仅通过nginx与外部世界进行交互。

tomcat请求Nginx服务器的标头中包含实际URL,nginx解析标头并将请求转发到URL并将响应呈现给tomcat。

问题

我如何通过Nginx将带有凭据的请求转发给商家?

1 个答案:

答案 0 :(得分:0)

您不能“转发”它。要基于标头的内容处理HTTP请求,nginx必须解密传入的数据并重新加密传出的修改后的数据。由于像SSL / TLS这样的安全协议的全部要点是,除授权端点外,其他任何人都无法看到或更改数据,因此nginx必须终止客户端SSL / TLS会话本身并创建单独的服务器端SSL / TLS会话在其上转发HTTP级别的数据。

因此要向“商户”服务器进行身份验证,必须使用客户端证书(包括链证书(如果适用)并匹配私钥)对nginx进行配置,请参见http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_certificate等。

(如果您还没有,可以将 public class Game { public String capitalanswer = ""; public String countryanswer = ""; private CountryDB db; public Game(){ this.db = new CountryDB(); } public String qa(){ List<String> countries = db.getCapitals(); int n = countries.size(); int index = (int)( n * Math.random()); String c = countries.get(index); capitalanswer = c; System.out.println(capitalanswer); Map<String, Country> data = db.getData(); Country ref = data.get(c); countryanswer = ref.toString(); System.out.println(countryanswer); if (Math.random() < 0.5){ return "What country has the capital " + ref.getCapital() + " ?" + "\n" + ref.getName(); }else{ return "What is the capital of " + ref.getName() + " ?" + "\n" + ref.getCapital(); } } 的JKS转换为PKCS12,而keytool -importkeystore的PKCS12转换为PEM –这里和其他堆栈上都有大量现有的Q超级用户和服务器故障。)

从(真实)客户端到nginx的会话是否使用同一证书进行身份验证,使用其他证书还是完全不使用证书进行身份验证,取决于nginx的配置。