自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

既然有了HTTP,為什么還要HTTPS?

開發(fā) 前端
與傳統(tǒng)的HTTP相比,HTTPS在網(wǎng)站地址前綴的使用,為用戶與網(wǎng)站之間構建了一道堅固的安全屏障。本文將從安全性、信任度、合規(guī)性、性能及未來發(fā)展等多個方面,深入探討為什么越來越多的網(wǎng)站選擇以HTTPS開頭,而不是HTTP。

在當今的互聯(lián)網(wǎng)時代,信息傳播的速度和互動的便捷性為我們的生活帶來了極大的便利。然而,隨之而來的數(shù)據(jù)安全與個人隱私保護問題也變得尤為緊迫。在這樣的背景下,HTTPS協(xié)議的普及已成為大勢所趨。

與傳統(tǒng)的HTTP相比,HTTPS在網(wǎng)站地址前綴的使用,為用戶與網(wǎng)站之間構建了一道堅固的安全屏障。本文將從安全性、信任度、合規(guī)性、性能及未來發(fā)展等多個方面,深入探討為什么越來越多的網(wǎng)站選擇以HTTPS開頭,而不是HTTP。

一、HTTPS相較于HTTP有哪些優(yōu)勢?

1.安全性:加密傳輸以抵御數(shù)據(jù)竊聽

超文本傳輸協(xié)議(HTTP)是互聯(lián)網(wǎng)中最廣泛使用的協(xié)議之一,其主要工作方式是明文傳輸數(shù)據(jù),這使得數(shù)據(jù)在傳輸過程中容易被監(jiān)聽、截取和篡改。這種情況在處理如用戶名、密碼和信用卡號等敏感信息時,構成了嚴重的安全風險。

相比之下,HTTPS協(xié)議通過在HTTP上增加SSL/TLS加密,保障了數(shù)據(jù)在傳輸過程中的安全。SSL/TLS協(xié)議利用公鑰和私鑰的非對稱加密技術,以及會話密鑰的對稱加密技術,為數(shù)據(jù)包提供了強有力的加密保護。

2.身份驗證:確保網(wǎng)站真實以防止釣魚欺詐

HTTPS不僅提供數(shù)據(jù)加密,還包含重要的身份驗證功能。網(wǎng)站在啟用HTTPS時,必須從權威的證書頒發(fā)機構(CA)獲取SSL證書。該證書包含了網(wǎng)站的身份信息并經(jīng)過數(shù)字簽名,確保用戶訪問的網(wǎng)站是真實可信的,而非假冒站點。

3.搜索引擎優(yōu)化與用戶體驗

使用HTTPS的網(wǎng)站在搜索結果中的排名可能會優(yōu)于HTTP網(wǎng)站。這不僅提升了網(wǎng)站的安全性,還間接提高了網(wǎng)站的搜索引擎可見度,吸引更多流量。

4.性能優(yōu)化與未來趨勢

過去,由于加密過程可能導致頁面加載速度減慢,HTTPS被視為影響性能的因素。但隨著技術的進步,如HTTP/2、HTTP/3協(xié)議的引入以及TLS 1.3的高效加密算法,HTTPS的性能劣勢已大大縮小。甚至在某些情況下,得益于協(xié)議優(yōu)化和瀏覽器預加載機制,HTTPS的性能表現(xiàn)優(yōu)于HTTP。

綜上所述,網(wǎng)站選擇以HTTPS開頭而非HTTP,是互聯(lián)網(wǎng)發(fā)展至今的必然結果。HTTPS不僅確保數(shù)據(jù)安全傳輸,還在構建信任、優(yōu)化搜索引擎排名、符合法規(guī)要求、提升用戶體驗以及適應技術發(fā)展趨勢等方面具有重要意義。

下面就從代碼實戰(zhàn)方向,詳述一下Java中如何實現(xiàn)HTTPS服務端、客戶端、簽名證書。

二、生成自簽名證書

打開命令行工具(CMD 或終端),運行以下命令生成自簽名證書:

keytool -genkeypair -alias test -keyalg RSA -keysize 2048 -validity 365 -storetype PKCS12 -keystore test.p12 -storepass password

1.該命令的各個參數(shù)說明如下:

  • -genkeypair:生成密鑰對(公鑰和私鑰)。
  • -alias test:密鑰對的別名為 test。
  • -keyalg RSA:密鑰算法為 RSA。
  • -keysize 2048:密鑰大小為 2048 位。
  • -validity 365:證書有效期為 365 天。
  • -storetype PKCS12:密鑰庫類型為 PKCS12。
  • -keystore test.p12:密鑰庫文件名為 test.p12。
  • -storepass password:密鑰庫密碼為 password。

在運行上述命令時,您會被提示輸入一些信息,如下:

What is your first and last name?
  [Unknown]:  Your Name
What is the name of your organizational unit?
  [Unknown]:  Your Organizational Unit
What is the name of your organization?
  [Unknown]:  Your Organization
What is the name of your City or Locality?
  [Unknown]:  Your City
What is the name of your State or Province?
  [Unknown]:  Your State
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=Your Name, OU=Your Organizational Unit, O=Your Organization, L=Your City, ST=Your State, C=US correct?
  [no]:  yes

按照提示輸入相關信息,完成后自簽名證書將生成在 test.p12 文件中。

2.解決報錯:執(zhí)行命令之后,keytool 錯誤: java.io.IOException: toDerInputStream rejects tag type 107

這個錯誤通常表示密鑰庫文件格式或其內容有問題。以下是一些可能的解決方案:

  • 檢查keytool命令和參數(shù):確保您使用了正確的命令和參數(shù)來生成密鑰庫文件。
  • 嘗試不同的密鑰庫格式:嘗試使用 JKS(Java KeyStore)格式而不是 PKCS12。雖然 PKCS12 是更現(xiàn)代的標準,但是 JKS 在某些情況下可能更兼容。
  • 確保環(huán)境變量正確:確保您的環(huán)境變量和 keytool 版本正確,尤其是如果您有多個 Java 安裝。

3.自動填寫信息

如果不想每次都手動輸入這些信息,可以在命令中使用 -dname 參數(shù)指定這些信息。例如:

keytool -genkeypair -alias test -keyalg RSA -keysize 2048 -validity 365 -keystore test.p12 -storetype PKCS12 -storepass password -dname "CN=Your Name, OU=Your Organizational Unit, O=Your Organization, L=Your City, ST=Your State, C=CN"

4.解決報錯:執(zhí)行之后報錯,keytool 錯誤: java.lang.Exception: 密鑰庫文件存在, 但為空: test.p12

這個錯誤表明 test.p12 文件已經(jīng)存在,但其中沒有內容??赡苁窃谥暗膰L試中創(chuàng)建了這個文件,但沒有成功寫入任何數(shù)據(jù)。以下是解決方案:

刪除現(xiàn)有的空文件并重新生成

不需要在執(zhí)行 keytool 命令之前手動創(chuàng)建 test.p12 文件。keytool 命令會自動生成并創(chuàng)建這個文件。如果 test.p12 文件已經(jīng)存在,keytool 會更新這個文件中的密鑰對和證書。

刪除文件后,提示我keytool 錯誤: java.io.FileNotFoundException: test.p12 (拒絕訪問。)

確認當前用戶有權限

確保當前用戶對相關目錄和文件具有讀寫權限。如果您在 Windows 上運行命令提示符或在 Unix/Linux 系統(tǒng)上運行終端,嘗試使用管理員權限。

Windows 系統(tǒng)

  • 以管理員身份運行命令提示符
  • 右鍵點擊“命令提示符”,選擇“以管理員身份運行”。
  • 確認文件是否存在并刪除

Unix/Linux 系統(tǒng)

以超級用戶身份運行終端

  • 使用 sudo 提升權限:```sudo rm test.p12`1``

總結步驟

  • 以管理員權限運行命令提示符或終端。
  • 刪除空的 test.p12 文件。
  • 確保當前用戶對目錄具有寫權限。
  • 重新生成自簽名證書。

三、示例代碼

1.本地 HTTPS 服務器

在生成了自簽名證書之后,可以將其用于您的 HTTPS 服務器配置中。

使用生成的自簽名證書配置一個本地 HTTPS 服務器。

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsServer;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.security.KeyStore;

public class LocalHttpsServer {
    public static void main(String[] args) throws Exception {
        // 加載密鑰庫
        char[] passphrase = "password".toCharArray();
        KeyStore ks = KeyStore.getInstance("PKCS12");
        ks.load(new FileInputStream("C:\\Program Files\\Java\\jdk1.8.0_60\\bin\\test.p12"), passphrase);

        // 初始化密鑰管理器工廠
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, passphrase);

        // 初始化信任管理器工廠
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);

        // 初始化 SSL 上下文
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        // 創(chuàng)建 HTTPS 服務器
        HttpsServer httpsServer = HttpsServer.create(new InetSocketAddress(8443), 0);
        httpsServer.setHttpsConfigurator(new HttpsConfigurator(sslContext));

        // 創(chuàng)建處理器
        httpsServer.createContext("/api", new HttpHandler() {
            @Override
            public void handle(HttpExchange exchange) {
                try {
                    if ("POST".equals(exchange.getRequestMethod()) && "application/json".equals(exchange.getRequestHeaders().getFirst("Content-Type"))) {
                        InputStream is = exchange.getRequestBody();
                        StringBuilder jsonString = new StringBuilder();
                        int i;
                        while ((i = is.read()) != -1) {
                            jsonString.append((char) i);
                        }

                        System.out.println("Received JSON: " + jsonString.toString());

                        String response = "{\"message\":\"Received\"}";
                        exchange.getResponseHeaders().set("Content-Type", "application/json");
                        exchange.sendResponseHeaders(200, response.getBytes().length);
                        OutputStream os = exchange.getResponseBody();
                        os.write(response.getBytes());
                        os.close();
                    } else {
                        exchange.sendResponseHeaders(405, -1); // Method Not Allowed
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

        // 啟動服務器
        httpsServer.setExecutor(null);
        httpsServer.start();
        System.out.println("HTTPS server started at https://localhost:8443/api");
    }
}

2.測試 HTTPS 服務器

創(chuàng)建好 HTTPS 服務器后,您可以使用以下 Java 客戶端進行測試:

import javax.net.ssl.*;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class HttpsPostJsonClient {
    public static void main(String[] args) {
        String httpsURL = "https://localhost:8443/api";
        String jsonInputString = "{\"param1\":\"value1\",\"param2\":\"value2\"}";

        try {
            // 信任所有證書
            TrustManager[] trustAllCerts = new TrustManager[]{
                    new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() { return null; }
                        public void checkClientTrusted(X509Certificate[] certs, String authType) { }
                        public void checkServerTrusted(X509Certificate[] certs, String authType) { }
                    }
            };

            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                public boolean verify(String hostname, javax.net.ssl.SSLSession sslSession) {
                    return true;
                }
            });

            // 創(chuàng)建 URL 對象
            URL url = new URL(httpsURL);
            HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

            // 設置請求方法為 POST
            connection.setRequestMethod("POST");

            // 允許寫入和讀取數(shù)據(jù)
            connection.setDoOutput(true);
            connection.setDoInput(true);

            // 設置請求頭
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setRequestProperty("Accept", "application/json");

            // 發(fā)送 POST 數(shù)據(jù)
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("UTF-8");
                os.write(input, 0, input.length);
            }

            // 讀取響應
            try (InputStream is = connection.getInputStream();
                 BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"))) {
                StringBuilder response = new StringBuilder();
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
                System.out.println("Response: " + response.toString());
            }

        } catch (Exception e) {
            System.out.println("exceptinotallow===: " + e);
        }
    }
}

3.測試

(1)通過curl 命令行測試

curl -X POST https://localhost:8443/api -H "Content-Type: application/json" -d '{"param1":"value1","param2":"value2"}' -k

(2)通過客戶端代碼測試

通過上述步驟,您可以生成自簽名證書,并使用 Java 創(chuàng)建一個本地 HTTPS 服務器,接收 application/json 的 POST 請求,并通過 Java 客戶端進行測試。

4.解決報錯:通過你的測試服務器代碼訪問之后報錯,java.io.IOException: Server returned HTTP response code: 405 for URL: https://localhost:8443/api

HTTP 405 錯誤表示 "Method Not Allowed",即服務器端拒絕了請求方法。由于我們在示例中設定了服務器僅接受 POST 請求,如果客戶端發(fā)送了其他方法(例如 GET),服務器會返回 405 錯誤。

我們需要確保客戶端代碼確實發(fā)送了 POST 請求,并且服務器端處理程序正確設置。

我是因為設置請求頭時,寫的connection.setRequestProperty("Content-Type", "application/json; utf-8");,將其改為connection.setRequestProperty("Content-Type", "application/json");就解決了。

責任編輯:姜華 來源: 哪吒編程
相關推薦

2019-08-05 14:23:43

DockerKubernetes容器

2022-07-19 08:01:32

HTTP協(xié)議RPC

2023-09-07 08:07:56

goHTTP網(wǎng)絡

2023-01-12 09:01:01

MongoDBMySQL

2022-06-07 08:39:35

RPCHTTP

2020-11-25 09:36:17

HTTPRPC遠程

2020-11-30 15:40:40

技術資訊

2022-10-08 00:00:00

websocket協(xié)議HTTP

2023-12-11 12:03:14

Python工具元組

2021-12-20 10:30:33

forforEach前端

2022-09-13 08:44:02

IP網(wǎng)絡MAC地址

2024-04-16 08:26:18

IP地址MAC地址

2022-07-12 08:56:18

公平鎖非公平鎖Java

2024-04-03 08:32:30

2019-04-24 08:00:00

HTTPSHTTP前端

2023-10-24 15:15:26

HTTPWebSocket

2021-10-12 18:48:07

HTTP 協(xié)議Websocket網(wǎng)絡通信

2021-05-12 08:15:53

HTTPSHTTP安全

2015-09-01 09:28:55

calayeruiview區(qū)別

2019-11-20 10:39:35

iPhone緩存清理
點贊
收藏

51CTO技術棧公眾號