忽略Java中的自簽名證書

我在職業生涯中遇到過幾次問題,就是我們有時希望允許自簽名證書用于開發或測試目的。 Google的快速搜索顯示了多年來無數Java開發人員遇到的麻煩。

根據確切的證書問題,您可能會收到類似以下內容之一的錯誤,盡管我幾乎肯定有其他表現形式:

java.security.cert.CertificateException: Untrusted Server Certificate Chainjavax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

要解決此問題,通常需要修改JDK信任庫文件,這可能會很痛苦,而且常常會遇到麻煩。 最重要的是,您團隊中的每個開發人員都必須做同樣的事情,并且您在每個新環境中都會遇到相同的問題。

幸運的是,有一種方法可以以通用的方式解決問題,而不會給開發人員帶來任何負擔。 我們將重點介紹普通的HttpURLConnection類型的連接,因為它是最通用的類??型,仍應幫助您了解其他庫的使用方向。 如果您使用的是Apache HttpClient,請參見此處 。

警告:知道您在做什么!

請注意使用此代碼的含義:這意味著您完全不關心主機驗證,而僅使用SSL來加密通信。 您不是要防止中間人攻擊,也不是要確保您已連接到您認為是的主機。 通常可以歸結為一些有效的情況:

  1. 您在鎖定的LAN環境中操作。 您不容易受到攻擊者攔截的請求(或者如果存在,則問題更大)。
  2. 您所處的測試或開發環境中,確保通信安全并不重要。

如果這符合您的需求,請繼續進行。 否則,也許要三思而后行地想要完成什么。

解決方案:修改信任管理器

既然我們已經放棄了這個免責聲明,我們就可以解決眼前的實際問題。 Java允許我們控制負責驗證HttpsURLConnection的主機和證書的對象。 這可以在全球范圍內完成,但是我敢肯定,有經驗的人會畏縮于做出如此徹底的改變的想法。 幸運的是,我們還可以根據每個請求進行操作,并且由于很難在網絡上找到此類示例,因此我在下面提供了代碼。 這種方法很好,因為您無需在全球范圍內換掉SSLSocketFactory實現。

隨時獲取它并在您的項目中使用它。

package com.mycompany.http;import java.net.*;
import javax.net.ssl.*;
import java.security.*;
import java.security.cert.*;public class TrustModifier {private static final TrustingHostnameVerifierTRUSTING_HOSTNAME_VERIFIER = new TrustingHostnameVerifier();private static SSLSocketFactory factory;/** Call this with any HttpURLConnection, and it willmodify the trust settings if it is an HTTPS connection. */public static void relaxHostChecking(HttpURLConnection conn)throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {if (conn instanceof HttpsURLConnection) {HttpsURLConnection httpsConnection = (HttpsURLConnection) conn;SSLSocketFactory factory = prepFactory(httpsConnection);httpsConnection.setSSLSocketFactory(factory);httpsConnection.setHostnameVerifier(TRUSTING_HOSTNAME_VERIFIER);}}static synchronized SSLSocketFactoryprepFactory(HttpsURLConnection httpsConnection)throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {if (factory == null) {SSLContext ctx = SSLContext.getInstance("TLS");ctx.init(null, new TrustManager[]{ new AlwaysTrustManager() }, null);factory = ctx.getSocketFactory();}return factory;}private static final class TrustingHostnameVerifier implements HostnameVerifier {public boolean verify(String hostname, SSLSession session) {return true;}}private static class AlwaysTrustManager implements X509TrustManager {public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { }public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { }public X509Certificate[] getAcceptedIssuers() { return null; }}}

用法

要使用上面的代碼,只需在打開流之前調用RelaxHostChecking()方法即可:

URL someUrl = ... // may be HTTPS or HTTP
HttpURLConnection connection = (HttpURLConnection) someUrl.openConnection();
TrustModifier.relaxHostChecking(connection); // here's where the magic happens// Now do your work!
// This connection will now live happily with expired or self-signed certificates
connection.setDoOutput(true);
OutputStream out = connection.getOutputStream();
...

在那里,它是支持自簽名證書的本地化方法的完整示例。 這不會影響您的應用程序的其余部分,而其余部分將繼續具有嚴格的托管檢查語義。 該示例可以擴展為使用配置設置來確定是否應使用寬松的主機檢查,如果使用此代碼主要是通過自簽名證書進行開發的一種方式,我建議您這樣做。

參考: Carfey Software Blog上的 JCG合作伙伴 忽略了Java中的自簽名證書 。

相關文章 :
  • 使用Spring Security 3.1保護RESTful Web服務
  • 使用Spring Security保護GWT應用程序
  • JBoss 4.2.x Spring 3 JPA Hibernate教程
  • 調試生產服務器– Eclipse和JBoss展示
  • Java EE6 CDI,命名組件和限定符
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/12/ignoring-self-signed-certificates-in.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C排序算法:(三)插入排序

像打撲克牌一樣&#xff0c;每次摸一張牌&#xff0c;把牌插入正確位置。 #include <stdio.h>void Insert_Sort_Small_To_Big(unsigned char* input_data, unsigned int input_length) {int i 0, j 0;unsigned char temp 0;for (i 1; i < input_length; i){temp …

sqlserver中自定義函數+存儲過程實現批量刪除

由于項目的需要&#xff0c;很多模塊都要實現批量刪除的功能。為了方便模塊的調用&#xff0c;把批量刪除方法寫成自定義函數。直接上代碼。 自定義函數&#xff1a; ALTER FUNCTION [dbo].[func_SplitById] (str varchar(50),split varchar(10))--傳過來的id字符串 --分割的標…

c語言選擇排序_C語言——選擇排序

1 選擇排序&#xff08;5分&#xff09;題目內容&#xff1a;編寫選擇排序&#xff0c;要求排序過程調用函數實現&#xff0c;在主函數輸入n個數據&#xff0c;調用函數后&#xff0c;輸出排好序的元素輸入格式:輸入整型數n&#xff0c;并輸入n個整數&#xff0c;輸入數據用空格…

算法—巧排撲克牌(C語言)

/*小明剛上小學&#xff0c;學會了第一個撲克牌“魔術”&#xff0c;到處給人表演。魔術的內容是這樣的&#xff1a;他手里握著一疊撲克牌&#xff1a;A&#xff0c;2&#xff0c;....J&#xff0c;Q&#xff0c;K 一共13張。他先自己精心設計它們的順序&#xff0c;然后正面朝…

LeetCode Binary Tree Paths(簡單題)

題意&#xff1a;   給出一個二叉樹&#xff0c;輸出根到所有葉子節點的路徑。 思路&#xff1a; 直接DFS一次&#xff0c;只需要判斷是否到達了葉子&#xff0c;是就收集答案。 1 /**2 * Definition for a binary tree node.3 * struct TreeNode {4 * int val;5 * …

我的測試和代碼分析工具箱

上周&#xff0c;我們在LINEAS成立了一個“測試技能小組”&#xff0c;該小組用于交換有關測試的知識。 各種各樣的問題反復出現的一個問題是&#xff1a;有哪些工具可以測試和分析您的代碼&#xff1f; 因此&#xff0c;這是我對此的個人回答&#xff0c;按照我傾向于將其介紹…

新唐M0 KEIL環境搭建,找不到device不識別,關鍵:Nu-Link_Keil_Driver

公司用新唐的芯片&#xff0c;網上關于新唐的資料相對ST確實少得可憐&#xff0c;搭建環境也是搞了好久&#xff0c;去keil官網下載安裝了新唐的pack 打開官方參考工程還是提示找不到device&#xff0c;option里面也沒有識別出來。 百度了好久&#xff0c;嘗試了各種辦法&…

c語言有趣代碼_【新課預知】——C語言程序設計

編者按&#xff1a;如今疫情這么嚴重&#xff0c;為了保護好自己&#xff0c;為了身邊的人&#xff0c;大家可一定要聽從國家號召——“宅”起來&#xff01;并且&#xff0c;小編們為了讓大家伙“宅”得更加健康&#xff0c;可是費了不少腦筋呢&#xff0c;學哉數理公眾號首次…

用R語言的quantreg包進行分位數回歸

什么是分位數回歸 分位數回歸(Quantile Regression)是計量經濟學的研究前沿方向之一&#xff0c;它利用解釋變量的多個分位數&#xff08;例如四分位、十分位、百分位等&#xff09;來得到被解釋變量的條件分布的相應的分位數方程。 與傳統的OLS只得到均值方程相比&#xff0c;…

算法—快速排序Sqrt (C語言)

/* 快速排序 */ #include"stdio.h" #include"stdlib.h" int compare(const void* a,const void* b) {return (*(int *)a-*(int *)b); }int main() {int i,a[]{32,29,59,8,22,68,89,77},n;nsizeof(a)/sizeof(a[0]);printf("排序前:\n");for(i0;i&…

常規單元測試和存根–測??試技術4

我的上一個博客是有關測試代碼的方法以及討論您要做和不需要進行測試的方法的一系列博客中的第三篇。 它基于我使用一種非常常見的模式從數據庫中檢索地址的簡單方案&#xff1a; …并且我提出了這樣的想法&#xff1a;任何不包含任何邏輯的類都不需要進行單元測試。 在其中&am…

中微CMS32 Keil環境搭建

打開中微官網https://www.mcu.com.cn/Products/113/pids/.html 把這三個資料都下載好。 環境搭建需要用的就是第三個pack包了 坑爹的是pack包下載下來是.zip格式 下載好后需要修改為.pack格式 運行即可。 打開三個資料中的demo code的工程 target和device都能識別出 編…

Windows下sass無法編譯

最近windows下使用sass老是出現各種莫名其買的問題&#xff0c;下面是我的一些解決辦法 windows下編譯sass不支持中文解決辦法網上給的是 解決辦法&#xff1a; 1.koala可視化編譯工具&#xff0c; 找到安裝目錄里面sass-3.3.7模塊下面的engine.rb文件&#xff0c;例如下面路徑…

數據庫面試中常用的10個問題

1&#xff0e;觸發器的作用&#xff1f;答&#xff1a;觸發器是一中特殊的存儲過程&#xff0c;主要是通過事件來觸發而被執行的。它可以強化約束&#xff0c;來維護數據的完整性和一致性&#xff0c;可以跟蹤數據庫內的操作從而不允許未經許可的更新和變化。可以聯級運算。如&…

測試技巧–不編寫測試

對此沒有太多疑問&#xff0c;測試代碼的方式是一個有爭議的問題。 不同的測試技術因各種原因&#xff08;包括企業文化&#xff0c;經驗和總體心理觀點&#xff09;而受到不同開發人員的青睞。 例如&#xff0c;您可能更喜歡編寫經典的單元測試&#xff0c;通過檢查返回值來單…

Ubuntu鏡像下載地址

https://mirrors.aliyun.com/ubuntu-releases/ 用迅雷下載速度挺快的

算法—實現排列 A(n,m)

/* 實現排列A&#xff08;n,m&#xff09;*/ #include "stdio.h" int m,n,a[30]; long s0; int main() {int p(int k);printf("input n(n<10):"); scanf("%d",&n);printf("input m(<1m<n):"); scanf("%d",&…

oracle忘記用戶密碼

在cmd命令行下輸入sqlplus / as sysdba alter user system identified by abc; 就可以將system用戶的密碼改成abc了。 alter user sys identified by abc; sys用戶的密碼也改成abc了。 然后你再登錄sqlplus: 轉載于:https://www.cnblogs.com/zzlp/p/4936109.html

python初體驗-hello world答案_Python初體驗_基礎(一)

一&#xff1a;變量 變量的賦值&#xff1a; name “Meng” 上述代碼聲明了一個變量&#xff0c;變量名為name&#xff0c;變量name的值為&#xff1a;”Meng“ 變量定義&#xff1a; 一個在內存存數據的容器。 變量的意義&#xff1a; 保存程序執行的中間結果或狀態&#xff…

Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum (離線樹狀數組+前綴xor)

題目鏈接&#xff1a;http://codeforces.com/contest/703/problem/D 給你n個數&#xff0c;m次查詢&#xff0c;每次查詢問你l到r之間出現偶數次的數字xor和是多少。 我們可以先預處理前綴和Xor[i]&#xff0c;表示1~i的xor和。因為num^num0&#xff0c;所以Xor[r] ^ Xor[l - 1…