Web服务Https配置和代码访问方法

一、Https方式及证书

Web服务使用Https方式需要SSL证书,证书可从两个渠道获取:公开可信认证机构申请或自己生成。

公开可信认证机构优势在于校验方便,但是会有租金。

自己生成工具成本低,但用浏览器访问时会提示风险,需要用户手动确认可信。

Https还分单向认证和双向认证,单向认证只需要服务器端部署1份证书,双向认证要Client和Server端都有证书,而且还会增加Client和Server握手步骤。

单向认证已经能够满足传输数据的加密需求,所以登录服务器与客户端通讯采用自己生成SSL证书的Https单向认证方式。

证书有以下常用文件格式:JKS(.keystore),微软(.pfx),PEM(.key + .crt)。

在Web服务器端部署Https时,Tomcat用的是JKS格式,Nginx用的是PEM格式。

生成证书时需要输入密码时,注意最好都用同一个。

二、生成JKS证书

通过JDK自带的keytool工具生成JKS证书:

1.打开命令行窗口,如果是Windows7系统注意要以管理员身份运行。

2.进入JDK安装目录下的bin目录,输入命令:

keytool -genkey -v -alias testKey -keyalg RSA -validity 3650 -keystore c:\test.keystore

alias: 别名

keyalg: 证书算法,RSA

validity:证书有效时间,10年

keystore:证书生成的目标路径和文件名 c:\test.keystore

3.输入完上条命令回车会要求输入一些信息,需要记住自己输入的秘钥库口令和秘要口令,最好用同一个,会在Tomcat配置Https时用到。

4.最后会在c盘根目录得到生成好的test.keystore。

三、生成PEM证书

通过刚才生成的JKS证书转成PEM证书,手工转换步骤较多,所以通过kestore-export工具(百度网盘下载链接)转换。

工具包含的文件:

运行JKS2PFX转换,命令格式为:

JKS2PFX <KeyStore文件> <KeyStore密码> <Alias别名> <导出文件名> [Java Runtime的目录]

为了简化操作,可以直接运行已经编辑好的go.bat来转换。

用go.bat前注意,需要把.keystore放到本目录下,命令最后的[Java Runtime的目录]如果是包含有空格的路径,需要用Windows简化的写法,不能用双引号括起来的(比如”c:\Program Files\Java\jdk...”)。运行go.bat时还会让输入密码,最好跟前边的密码都统一。完成后,目录里会多出.crt,.key,.pfx三个文件。

四、Tomcat配置Https

1.把.keystore格式的证书放到Tomcat服务器上。

2.在安装好的Tomcat的conf目录下,找到Server.xml文件,找到:

3.把这个Connector配置解注释,并添加下图红框内参数:

keystoreFile:指向.keystore证书的路径

keystorePass:生成.keystore时的密码

4.重启Tomcat服务,通过https://[Tomcat服务器IP]:8443/可以访问之前的Web服务说明配置成功。8443是Tomcat自己的定义的端口,如果改成https默认的443端口,访问时可省去端口参数。

5.如果使用的是自己生成的证书,浏览器访问时会提示风险,确认下就可以正常访问。

五、Nginx配置Https

1.安装好Nginx后,安装目录下找到nginx.conf配置文件,找到Server段。

2.修改监听的端口,有80改为443。

3.添加SSL参数,填上PEM证书的.key和.crt文件所在位置。

4.重启Nginx即可生效。

server{

listen 443;

server_name mxyx.login;

index index.jsp;

root /home/www;

ssl     on;

ssl_certificate /home/test.crt;

ssl_certificate_key     /home/test.key;

(...)

}

六、Java通过HttpClient访问Https方法

传入已经创建好的HttpClient实例,返回可访问Https的httpClient。

public static HttpClient wrapClient(HttpClient base) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
 
                public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                }
 
                public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
                }
 
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            X509HostnameVerifier verifier = new X509HostnameVerifier() {
 
                @Override
                public void verify(String string, SSLSocket ssls) throws IOException {
                }
 
                @Override
                public void verify(String string, X509Certificate xc) throws SSLException {
                }
 
                @Override
                public void verify(String string, String[] strings, String[] strings1) throws SSLException {
                }
 
                @Override
                public boolean verify(String string, SSLSession ssls) {
                    return true;
                }
            };
            ctx.init(null, new TrustManager[] { tm }, null);
            SSLSocketFactory ssf = new SSLSocketFactory(ctx);
            ssf.setHostnameVerifier(verifier);
            ClientConnectionManager ccm = base.getConnectionManager();
            SchemeRegistry sr = ccm.getSchemeRegistry();
            sr.register(new Scheme("https", ssf, 443));
            return new DefaultHttpClient(ccm, base.getParams());
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

七、C#访问Https方法

string url="";
WWWForm form=null;
string result = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create (url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
//如果有post数据------
Stream sendStream = request.GetRequestStream ();
byte[] formData = form.data;
sendStream.Write (formData, 0, formData.Length);
sendStream.Close ();
//-------------
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback (CheckValidationResult);

HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
if (response.StatusCode == HttpStatusCode.OK) {
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) {
result = reader.ReadToEnd ();
reader.Close ();
}
}

八、抓包验证

通过tcpdump命令查看指定端口的通讯数据

tcpdump -i eth1 -vv ‘port 8080‘ -nn -X

eth1 外网网卡名称

8080 要监听的端口

时间: 2024-08-27 21:24:57

Web服务Https配置和代码访问方法的相关文章

System.Web.Http.Cors配置跨域访问的两种方式

System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心得.在webapi中使用System.Web.Http.Cors配置跨域信息可以有两种方式.  一种是在App_Start.WebApiConfig.cs的Register中配置如下代码,这种方式将在所有的webapi Controller里面起作用. using System; using Sys

web服务安装配置

本文主要是以 CentOS 6系列为操作系统,来安装配置web服务,并实现虚拟用户,https,和基本的用户认证等相关内容. 写在前面: 操作系统: CentOS 6.5 服务器的IP: 172.16.10.9 httpd的版本:httpd-2.2.15 系列 SElINUX状态:disabled 下面开始安装配置旅程: 一.web的安装配置 1.安装:yum install httpd  mod_ssl -y mod_ssl 是实现 https 协议时所依赖的包 2.配置文件的相关说明: 配置

Nginx作为WEB服务相关配置(性能优化,网络连接,访问控制,虚拟主机,https等等)

编译安装nginx yum -y install pcre-devel groupadd -r nginx useradd -g nginx -r nginx tar xf nginx-1.6.2.tar.gz cd nginx-1.6.2 ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf--user=nginx --group=nginx --error-log-path=/var/log/nginx

web服务_apache配置(2)v1.0

httpd-2.2的基础配置 /etc/httpd:ServerRoot conf/httpd.conf.conf.d/*.conf:配置文件 logs:日志文件 modules:模块文件 主配置文件:/etc/httpd/conf/httpd.conf directive value directive:不区分字符大小写:例如:ServerRoot: value:除了文件路径这外,大多数不区分字符大小写: ### Section 1: Global Environment           

在C#的Web项目中调用Matlab代码的方法

为了毕设的图形检索方向的研究,本人需要在信科的师兄师姐们已经完成的C#界面中,调用现在研究的算法的Matlab代码,以便看到实验的效果.前段时间已经拖延了1个多月,一方面因为实习越来越多事情,时间减少了很多:但更重要在于C#调用Matlab的方法真心麻烦,C#的Web项目中进行这个操作貌似会碰到更多细节上的问题.而且总是很不稳定,操作系统.Matlab或VS的版本.遗漏一些文件或步骤都会造成失败!这个问题本人已经搞了很长时间,直至前几天,在同学的帮助下,自己再弄一遍,总算成功了!下面我及时把这个

web服务_apache配置(3)v1.0

11.基于用户的访问控制 认证质询: WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码: 认证: Authorization:客户端用户填入账号和密码后再次发送请求报文:认证通过时,则服务器发送响应的资源: 认证方式有两种: basic:明文 digest:消息摘要认证 安全域:需要用户认证后方能访问的路径:应该通过名称对其进行标识,以便于告知用户认证的原因: 用户的账号和密码存放于何处? 虚拟账号:仅用于访问某服务时用到的认证标识 存储:(ttt

linux架构学习第二十六天之web服务搭建(apache)以及https的实现

内容: 1.httpd版本以及安装 2.httpd的配置文件详解 3.httpd的用户身份验证实现 4.httpd的虚拟主机的实现 5.https的通信过程以及实现演示 1.httpd版本以及安装 centos默认的httpd版本是2.2,而centos默认的httpd版本是2.4,这里演示的是centos6的httpd-2.2版本 安装的方式有两种,一个是rpm包安装,一个是编译安装,编译安装相关的配置文件需要手动设置,这里演示的是rpm包安装 httpd2.2和2.4的区别: 2.2的MPM

(转)ASP.NET Web 服务如何工作

https://msdn.microsoft.com/zh-cn/library/ms996410.aspx 发布日期 : 4/1/2004 | 更新日期 : 4/1/2004 摘要:了解 Microsoft ASP.NET Web 服务方法 (WebMethod) 如何为生成 Web 服务提供一种高效方法.WebMethod 可以将传统的 Microsoft .NET 方法公开为支持 HTTP.XML.XML 架构.SOAP 和 WSDL 的 Web 服务操作.WebMethod (.asmx

【Java】Web 服务编程技巧与窍门: 在 UDDI 注册中心为 Web 服务注册开发 UDDI Java 应用程序

本技巧建立了一个使用统一描述.发现和集成 (Universal Description, Discovery, and Integration,UDDI) 来注册应用程序级消费的 Web 服务实例.作者提供了详细的代码示例以及基于 Java 的统一描述.发现和集成 (Universal Description, Discovery,and Integration for Java,UDDI4J) API 的扩展 API,通过这些可以使您使用 UDDI 来进行您自己的开发. 0 评论: Andre