linux下https连接本地站点

来源:互联网 发布:linux清屏命令快捷键 编辑:程序博客网 时间:2024/06/06 03:24
接我上一篇看博客,生成的.keystore在我的用户根目录/home/liz下,然后编辑tomcat服务器的server.xml,开放https,端口默认是8443
 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"               maxThreads="150" scheme="https" secure="true"               clientAuth="false" sslProtocol="TLS"  keystoreFilekeystoreFile="/home/liz/.keystore"keystorePass="123456"/>

重启tomcat,在浏览器输入https://localhost:8443/ 可以看到成功了。


接下来是写个https客户端测试下


代码如下

package https;import java.io.BufferedReader;  import java.io.FileInputStream;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.MalformedURLException;  import java.net.URL;  import java.security.GeneralSecurityException;  import java.security.KeyStore;    import javax.net.ssl.HostnameVerifier;  import javax.net.ssl.HttpsURLConnection;  import javax.net.ssl.KeyManagerFactory;  import javax.net.ssl.SSLContext;  import javax.net.ssl.TrustManagerFactory;    public class HttpsPost {      /**      * 获得KeyStore.      * @param keyStorePath      *            密钥库路径      * @param password      *            密码      * @return 密钥库      * @throws Exception      */      public static KeyStore getKeyStore(String password, String keyStorePath)              throws Exception {          // 实例化密钥库          KeyStore ks = KeyStore.getInstance("JKS");          // 获得密钥库文件流          FileInputStream is = new FileInputStream(keyStorePath);          // 加载密钥库          ks.load(is, password.toCharArray());          // 关闭密钥库文件流          is.close();          return ks;      }        /**      * 获得SSLSocketFactory.      * @param password      *            密码      * @param keyStorePath      *            密钥库路径      * @param trustStorePath      *            信任库路径      * @return SSLSocketFactory      * @throws Exception      */      public static SSLContext getSSLContext(String password,              String keyStorePath, String trustStorePath) throws Exception {          // 实例化密钥库          KeyManagerFactory keyManagerFactory = KeyManagerFactory                  .getInstance(KeyManagerFactory.getDefaultAlgorithm());          // 获得密钥库          KeyStore keyStore = getKeyStore(password, keyStorePath);          // 初始化密钥工厂          keyManagerFactory.init(keyStore, password.toCharArray());            // 实例化信任库          TrustManagerFactory trustManagerFactory = TrustManagerFactory                  .getInstance(TrustManagerFactory.getDefaultAlgorithm());          // 获得信任库          KeyStore trustStore = getKeyStore(password, trustStorePath);          // 初始化信任库          trustManagerFactory.init(trustStore);          // 实例化SSL上下文          SSLContext ctx = SSLContext.getInstance("TLS");          // 初始化SSL上下文          ctx.init(keyManagerFactory.getKeyManagers(),                  trustManagerFactory.getTrustManagers(), null);          // 获得SSLSocketFactory          return ctx;      }        /**      * 初始化HttpsURLConnection.      * @param password      *            密码      * @param keyStorePath      *            密钥库路径      * @param trustStorePath      *            信任库路径      * @throws Exception      */      public static void initHttpsURLConnection(String password,              String keyStorePath, String trustStorePath) throws Exception {          // 声明SSL上下文          SSLContext sslContext = null;          // 实例化主机名验证接口          HostnameVerifier hnv = new MyHostnameVerifier();          try {              sslContext = getSSLContext(password, keyStorePath, trustStorePath);          } catch (GeneralSecurityException e) {              e.printStackTrace();          }          if (sslContext != null) {              HttpsURLConnection.setDefaultSSLSocketFactory(sslContext                      .getSocketFactory());          }          HttpsURLConnection.setDefaultHostnameVerifier(hnv);      }        /**      * 发送请求.      * @param httpsUrl      *            请求的地址      * @param xmlStr      *            请求的数据      */      public static void post(String httpsUrl, String xmlStr) {          HttpsURLConnection urlCon = null;          try {              urlCon = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();              urlCon.setDoInput(true);              urlCon.setDoOutput(true);              urlCon.setRequestMethod("POST");              urlCon.setRequestProperty("Content-Length",                      String.valueOf(xmlStr.getBytes().length));              urlCon.setUseCaches(false);              //设置为gbk可以解决服务器接收时读取的数据中文乱码问题              urlCon.getOutputStream().write(xmlStr.getBytes("gbk"));              urlCon.getOutputStream().flush();              urlCon.getOutputStream().close();              BufferedReader in = new BufferedReader(new InputStreamReader(                      urlCon.getInputStream()));              String line;              while ((line = in.readLine()) != null) {                  System.out.println(line);              }          } catch (MalformedURLException e) {              e.printStackTrace();          } catch (IOException e) {              e.printStackTrace();          } catch (Exception e) {              e.printStackTrace();          }      }        /**      * 测试方法.      * @param args      * @throws Exception      */      public static void main(String[] args) throws Exception {          // 密码          String password = "123456";          // 密钥库          String keyStorePath = "/home/liz/.keystore";          // 信任库          String trustStorePath = "/home/liz/.keystore";          // 本地起的https服务          String httpsUrl = "https://localhost:8443";          // 传输文本          String xmlStr = "";          HttpsPost.initHttpsURLConnection(password, keyStorePath, trustStorePath);          // 发起请求          HttpsPost.post(httpsUrl, xmlStr);      }  }  


package https;import javax.net.ssl.HostnameVerifier;  import javax.net.ssl.SSLSession;    /**  * 实现用于主机名验证的基接口。   * 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。  */  public class MyHostnameVerifier implements HostnameVerifier {      @Override      public boolean verify(String hostname, SSLSession session) {          if("localhost".equals(hostname)){              return true;          } else {              return false;          }      }  }  




测试可以返回整个tomcat页面的代码
0 0
原创粉丝点击