ITPub博客

首页 > 应用开发 > IT综合 > nginx使用ssl模块配置HTTPS支持

nginx使用ssl模块配置HTTPS支持

原创 IT综合 作者:百联达 时间:2015-03-18 16:12:37 0 删除 编辑
一:生成证书

$ cd /usr/local/nginx/conf
创建服务器私钥,命令会让你输入一个口令:

$ openssl genrsa -des3 -out server.key 1024
创建签名请求的证书(CSR):

$ openssl req -new -key server.key -out server.csr
在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:


$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key

二: 配置nginx
最后标记证书使用上述私钥和CSR:


$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
修改Nginx配置文件,让其包含新标记的证书和私钥:


server {
    server_name localhost;
    listen 443;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
}
重启nginx。

另外还可以加入如下代码实现80端口重定向到443


server {
listen 80;
server_name ww.centos.bz;
rewrite ^(.*) https://$server_name$1 permanent;
}

三: Apache HttpClient模拟https调用

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


import org.apache.http.client.HttpClient;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.PoolingClientConnectionManager;
import org.apache.log4j.Logger;


public class SSLHttpClientFactory {


private static Logger logger = Logger.getLogger(SSLHttpClientFactory.class);


/**
* @description 获取支持http,https两种协议的httpClient
* @param 
* @return
* @throws 
*/
public static HttpClient wrapClient(HttpClient httpClient) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {


@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {


}


@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] chain,
String authType)
throws java.security.cert.CertificateException {


}


@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {


return null;
}


};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, ssf));
registry.register(new Scheme("http", 80, PlainSocketFactory
.getSocketFactory()));
ClientConnectionManager mgr = new PoolingClientConnectionManager(
registry);
return new DefaultHttpClient(mgr, httpClient.getParams());
} catch (Exception e) {
logger.error("封装https client异常", e);
return httpClient;
}


}


}
=====================================================================

 /**
     * @description 发送json请求,并返回结果
     * @param url
     *            请求地址
     * @param jsonRequest
     *            请求参数
     * @return jsonResponse 返回结果
     * @throws
     */
    public static String sendJsonRequest(String url, String jsonRequest)
            throws Exception {
    logger.info("请求URL:" + url);
        logger.info("请求参数:" + jsonRequest);
        String jsonResponse = null;
        httpClient = new DefaultHttpClient();
       httpClient = SSLHttpClientFactory.wrapClient(httpClient );
        postMethod = new HttpPost(url);


        StringEntity entity = new StringEntity(jsonRequest, "UTF-8");
        entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING,
                Consts.UTF_8.toString()));
        entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                "application/json;charset=UTF-8"));


        postMethod.setEntity(entity);
        postMethod.getParams().setParameter(
                CoreProtocolPNames.USER_AGENT,
                System.getProperty("os.name") + "(version "
                        + System.getProperty("os.version") + " "
                        + System.getProperty("os.arch") + ") "
                        + System.getProperty("user.language"));
      //添加头信息告诉服务端可以对Response进行GZip压缩  
        postMethod.setHeader("Accept-Encoding", "gzip, deflate");
        // 开始请求
        startTime = System.currentTimeMillis();
        HttpResponse response = httpClient.execute(postMethod);


        logger.info("status:"+response.getStatusLine().getStatusCode());
        
        // 读取请求结果
        if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
            HttpEntity httpEntity = response.getEntity();
            //对gzip压缩过的返回结果 进行解密
            if(response.getFirstHeader("Content-Encoding") != null  && response.getFirstHeader("Content-Encoding").getValue().toLowerCase().indexOf("gzip") > -1) 
            {
            jsonResponse =dealGzipResponse(response);
            }
            else {
            jsonResponse = EntityUtils.toString(httpEntity);

}


        }
        endTime = System.currentTimeMillis();
        logger.info("返回结果size:" + jsonResponse.length());
        logger.info("返回结果:" + Des3.decode(jsonResponse,"B30588A0EF18527DBBFB5ADB"));
        logger.info("本次请求花费时间:" + (endTime - startTime) + "ms");


        return jsonResponse;


    }
    
    
    
    /**
     * @description 解析gzip返回结果
     * @param 
     * @return
     * @throws 
     */
    public static String dealGzipResponse(HttpResponse response) throws IOException
    {
    logger.info("=======解析gzip返回结果==========");
    InputStream is = response.getEntity().getContent(); 
        GZIPInputStream  gzin = new GZIPInputStream(is);  
        
        InputStreamReader isr = new InputStreamReader(gzin,"UTF-8");   
        java.io.BufferedReader br = new java.io.BufferedReader(isr);  
        StringBuffer sb = new StringBuffer();   
        String tempbf;  
        while ((tempbf = br.readLine()) != null) {  
            sb.append(tempbf);  
        }  
        isr.close();  
        gzin.close();  
        
        return sb.toString();
    }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28624388/viewspace-1464716/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
15年以上互联网经验,先后从事过制造业,证券业,物业行业和物流行业信息系统和互联网产品的设计落地实施,8年系统架构经验。最近关注企业数字化转型、财务数字化服务共享、大语言模型、Kubernetes微服务架构和Istio微服务治理框架。

注册时间:2013-02-05

  • 博文量
    332
  • 访问量
    1265606