Solo  当前访客:3 登录 注册

喧哗博客-http://blog.xuahua.com

繁华过后的沉寂--技术经验分享
浏览次数: 95,037    文章总数: 91    评论总数: 3
标签:

java基础篇--模拟浏览器请求https--安全协议https请求 有更新!

https 协议,因为安全,所以在处理上,也有些不同。现在给出示例

 

/**
	 * @param url
	 * @param xmlstring
	 * @param match_id 密钥-- .p12的密钥
	 * @param file "apiclient_cert.p12" .p12的文件路径
	 * @return
	 */
	public static String httpsGetRequest(String url, String xmlstring, String match_id,String file){
		    KeyStore keyStore;
		    StringBuilder result = new StringBuilder();
			try {
				keyStore = KeyStore.getInstance("PKCS12");
				FileInputStream instream = new FileInputStream(new File(file));
	            keyStore.load(instream, match_id.toCharArray());

		        // Trust own CA and all self-signed certs
		        SSLContext sslcontext = SSLContexts.custom()
		                .loadKeyMaterial(keyStore, match_id.toCharArray())
		                .build();
		        // Allow TLSv1 protocol only
		        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
		                sslcontext,
		                new String[] { "TLSv1" },
		                null,
		                SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		        CloseableHttpClient httpclient = HttpClients.custom()
		                .setSSLSocketFactory(sslsf)
		                .build();
		        try {

	            HttpGet httpget = new HttpGet(url);
	            System.out.println("executing request" + httpget.getRequestLine());
	            CloseableHttpResponse response = httpclient.execute(httpget);
	            try {
	                HttpEntity entity = response.getEntity();
	                System.out.println("----------------------------------------");
	                System.out.println(response.getStatusLine());
	                if (entity != null) {
	                    System.out.println("Response content length: " + entity.getContentLength());
	                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
	                    String text="";
	                    while ((text = bufferedReader.readLine()) != null) {
	                    	result.append(text);
	                    }
	                }
	                EntityUtils.consume(entity);
	            } finally {
	                response.close();
	            }
	        } finally {
	            httpclient.close();
	        }
			} catch (Exception e) {
				e.printStackTrace();
			}
		return result.toString();
	}
	

tomcat-https-安装布署笔记

tomcat_keys.docx
 

1)为服务器生成证书

 

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\keys\tomcat.keystore -validity 36500

tomcat

tomcat

admincas.tomcat.com

tomcat.com

tomcat.com

sz

gd

cn

y

 

2为客户端生成证书

keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:\keys\mykey.p12

操作第一步。

3让服务器信任客户端证书

keytool -export -alias mykey -keystore D:\keys\mykey.p12 -storetype PKCS12 -storepass tomcat -rfc -file D:\keys\mykey.cer

操作同第一步

 

 下一步,是将该文件导入到服务器的证书库,添加为一个信任证书使用命令如下:

  keytool -import -v -file D:\keys\mykey.cer -keystore D:\keys\tomcat.keystore

 

4让客户端信任服务器证书

keytool -keystore D:\keys\tomcat.keystore -export -alias tomcat -file D:\keys\tomcat.cer 

 

5) 证书导入jdk;提示输入密码--默认changeit

keytool -import -alias cacerts -keystore "%JAVA_HOME%\jre\lib\security\cacerts"  -file f:\keys\tomcat.cer  -trustcacerts 

6)配置Tomcat服务器

打开Tomcat根目录下的/conf/server.xml,找到Connector port="8443"配置段,修改为如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"

SSLEnabled="true" maxThreads="150" scheme="https"

secure="true" clientAuth="false" sslProtocol="TLS"

keystoreFile="D:\\keys\\tomcat.keystore" keystorePass="bdbvip"

  />

 

tomcat要与生成的服务端证书名一致)

 

7)测试

在浏览器中输入:https://localhost:8443/,会弹出选择客户端证书界面,点击“确定”,会进入tomcat主页,地址栏后会有“锁”图标,表示本次会话已经通过HTTPS双向验证,接下来的会话过程中所传输的信息都已经过SSL信息加密。

 

 

liunx-https-安装布署笔记 有更新!

1.1 openssl目录准备
一般情况下openssl的配置文件都在这个目录/etc/pki/tls,so:
 
mkdir /etc/pki/ca_linvo
 
cd /etc/pki/ca_linvo
 
mkdir root server client newcerts
 
echo 01 > serial
 
echo 01 > crlnumber
 
touch index.txt
 
1.2 openssl配置准备
 
 
修改openssl配置
 
vim /etc/pki/tls/openssl.cnf
 
找到这句注释掉,替换为下面那句
 
#default_ca      = CA_default
 
default_ca      = ca_linvo
 
把[ CA_default ]整个部分拷贝一份,改成上面的名字[ CA_linvo ]
 
修改里面的如下参数:
 
dir = /etc/pki/ca_linvo
 
certificate = $dir/root/ca.crt
 
private_key = $dir/root/ca.key
 
保存退出
 
2 创建CA根级证书
生成key: openssl genrsa -out /etc/pki/ca_linvo/root/ca.key  2048
生成csr:openssl req -new -key /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.csr -config openssl.cnf
 
生成crt:openssl x509 -req -days 3650 -in /etc/pki/ca_linvo/root/ca.csr -signkey /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/root/ca.crt
 
生成crl:openssl ca -gencrl -out /etc/pki/ca_linvo/root/ca.crl -crldays 7   -config openssl.cnf
 
生成的根级证书文件都在/etc/pki/ca_linvo/root/目录下
 
注意:创建证书时,建议证书密码设置长度>=6位,因为java的keytool工具貌似对它有要求。
 
3 创建server证书
生成key:openssl genrsa -out /etc/pki/ca_linvo/server/server.key 2048
 
生成csr:openssl req -new -key /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.csr  -config openssl.cnf
 
生成crt:openssl ca -in /etc/pki/ca_linvo/server/server.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/server/server.crt -days 3650  -config openssl.cnf
说明:
 
1、这里生成的crt是刚才ca根级证书下的级联证书,其实server证书主要用于配置正常单向的https,所以不使用级联模式也可以:
 
openssl rsa -in /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.key
openssl x509 -req -in /etc/pki/ca_linvo/server/server.csr -signkey /etc/pki/ca_linvo/server/server.key -out /etc/pki/ca_linvo/server/server.crt -days 3650
2、-days 参数可根据需要设置证书的有效期,例如默认365天
 
4 创建client证书
生成key:openssl genrsa -des3 -out /etc/pki/ca_linvo/client/client.key 2048
 
生成csr:openssl req -new -key /etc/pki/ca_linvo/client/client.key -out /etc/pki/ca_linvo/client/client.csr  -config openssl.cnf
 
将 vim index.txt.attr    中unique_subject = no
 
 
生成crt:openssl ca -in /etc/pki/ca_linvo/client/client.csr -cert /etc/pki/ca_linvo/root/ca.crt -keyfile /etc/pki/ca_linvo/root/ca.key -out /etc/pki/ca_linvo/client/client.crt -days 3650   -config openssl.cnf
说明:
 
1、这里就必须使用级联证书,并且可以重复该步骤,创建多套client证书
 
2、生成crt时可能会遇到如下报错:
 
openssl TXT_DB error number 2 failed to update database
可参照这里进行操作。
 
我使用的是方法一,即将index.txt.attr中unique_subject = no
 
5 配置nginx
这里只列出server段的关键部分:
 
  server{
        charset utf-8;
        ssl on;
        ssl_certificate /etc/pki/ca_linvo/server/server.crt;
        ssl_certificate_key /etc/pki/ca_linvo/server/server.key;
        ssl_session_timeout 5m;
 
        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;
}
 
tomcat 配置
 
  <Connector port="8443" 
                protocol="HTTP/1.1" scheme="https" secure="true"
                enableLookups="false"
                disableUploadTimeout="true"
                acceptCount="4096"
                SSLCertificateFile="/etc/pki/ca_linvo/server/server.crt" 
              SSLCertificateKeyFile="/etc/pki/ca_linvo/server/server.key"
               SSLVerifyClient="optional" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />
重启Nginx
 
6 测试
6.1 浏览器测试
由于是双向认证,直接通过浏览器访问https地址是被告知400 Bad Request(No required SSL certificate was sent)的,需要在本机安装client证书。
windows上安装的证书需要pfx格式,也叫p12格式,生成方式如下:
openssl pkcs12 -export -inkey /etc/pki/ca_linvo/client/client.key -in /etc/pki/ca_linvo/client/client.crt -out /etc/pki/ca_linvo/client/client.pfx 
然后考到windows中双击即可进行安装,安装时会提示输入生成证书时设置的密码。
安装成功后,重启浏览器输入网址访问,浏览器可能会提示你选择证书,选择刚才安装的那个证书即可。
此时有些浏览器会提示用户该证书不受信任,地址不安全之类,这是因为我们的server证书是我
 
cat /etc/pki/ca_linvo/client/client.crt /etc/pki/ca_linvo/client/client.key > /etc/pki/ca_linvo/client/client.pem

公告

喧哗博客--繁华过后的沉寂--技术经验分享^-^
Copyright (c) 2009-2019, b3log.org & hacpai.com