Java Keytool 介紹

来源:https://www.cnblogs.com/wuyongyin/archive/2023/01/15/17005314.html
-Advertisement-
Play Games

keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。 1、簡介 keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和 ...


keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。

1、簡介

keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和服務驗證自己)或數據完整性和身份驗證服務。keytool 命令還允許用戶緩存通信對等體的公鑰(以證書的形式)。

證書是來自一個實體(個人、公司等)的數字簽名聲明,它表示實體的公鑰(和一些其他信息)具有特定的值。對數據進行數字簽名時,可以對簽名進行驗證,以驗證數據的完整性和真實性。完整性意味著數據沒有被修改或篡改,真實性意味著數據來自聲稱創建並簽名它的人。

keytool 命令還允許用戶管理對稱加密和解密中使用的秘密密鑰和口令。

keytool 命令將密鑰和證書存儲在keystore中。

2、用法

keytool [commands]

命令如下:

-certreq            生成證書請求
-changealias        更改條目的別名
-delete             刪除條目
-exportcert         導出證書
-genkeypair         生成密鑰對
-genseckey          生成密鑰
-gencert            根據證書請求生成證書
-importcert         導入證書或證書鏈
-importpass         導入口令
-importkeystore     從其他密鑰庫導入一個或所有條目
-keypasswd          更改條目的密鑰口令
-list               列出密鑰庫中的條目
-printcert          列印證書內容
-printcertreq       列印證書請求的內容
-printcrl           列印 CRL 文件的內容
-storepasswd        更改密鑰庫的存儲口令

可以使用如下命令查看每個命令的用法:

keytool -command_name -help

命令的參數有些是有預設值的,使用命令時可以不指定:

-alias "mykey"
 
-keyalg
    "DSA" (when using -genkeypair)
    "DES" (when using -genseckey)
 
-keysize
    2048 (when using -genkeypair and -keyalg is "RSA")
    1024 (when using -genkeypair and -keyalg is "DSA")
    256 (when using -genkeypair and -keyalg is "EC")
    56 (when using -genseckey and -keyalg is "DES")
    168 (when using -genseckey and -keyalg is "DESede")
 
-validity 90
 
-keystore <the file named .keystore in the user's home directory>
 
-storetype <the value of the "keystore.type" property in the
    security properties file, which is returned by the static
    getDefaultType method in java.security.KeyStore>
 
-file
    stdin (if reading)
    stdout (if writing)
 
-protected false

-sigalg
    "SHA256withDSA" (when the underlying private key is of type DSA)
    "SHA256withRSA" (when the underlying private key is of type RSA)
    "SHA256withECDSA" (when the underlying private key is of type EC)

3、具體使用

3.1、創建密鑰對

使用“keytool -genkeypair"命令會生成一個密鑰對(公鑰和私鑰)並將公鑰包裝到X.509 v3自簽名證書中,密鑰對存儲在以別名標識的條目中,條目類型為 PrivateKeyEntry。

使用命令 keytool -genkeypair -help 查看用法:

keytool -genkeypair [OPTION]...

生成密鑰對

選項:

 -alias <alias>                  要處理的條目的別名
 -keyalg <keyalg>                密鑰演算法名稱
 -keysize <keysize>              密鑰位大小
 -groupname <name>               Group name. For example, an Elliptic Curve name.
 -sigalg <sigalg>                簽名演算法名稱
 -destalias <destalias>          目標別名
 -dname <dname>                  唯一判別名
 -startdate <startdate>          證書有效期開始日期/時間
 -ext <value>                    X.509 擴展
 -validity <valDays>             有效天數
 -keypass <arg>                  密鑰口令
 -keystore <keystore>            密鑰庫名稱
 -storepass <arg>                密鑰庫口令
 -storetype <storetype>          密鑰庫類型
 -providername <providername>    提供方名稱
 -providerclass <providerclass>  提供方類名
 -providerarg <arg>              提供方參數
 -providerpath <pathlist>        提供方類路徑
 -v                              詳細輸出
 -protected                      通過受保護的機制的口令

下麵創建一個別名為 test1 的條目:

keytool -genkeypair -alias test1 -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12

註意:

1、如果指定的密鑰庫不存在,則會自動創建,需要設置密鑰庫口令;如果密鑰庫存在需要輸入密鑰口令。
2、如果創建預設類型(JKS)的密鑰庫,則可使用"-keypass"參數指定條目的密鑰口令,如果沒有指定則會在最後一步提示"輸入該條目的密鑰口令,(如果與密鑰庫口令相同按回車)",一般設為與密鑰庫口令相同。如果創建 PKCS12 類型的密鑰庫,則會忽略條目的密鑰口令參數,因為 PKCS12 不支持設置密鑰庫條目密鑰口令,預設它與密鑰庫密碼一致。

3.2、創建密鑰

keytool -genseckey -alias test1 -keystore /home/mongo/test2.keystore -storetype jceks

創建密鑰時,-storetype 需指定為 jceks,否則會報錯。

3.3、查看密鑰庫信息

keytool -list -v -keystore /home/mongo/test.keystore

指定密鑰庫的位置,查看該密鑰庫的條目信息。

3.4、導出證書

keytool -exportcert -keystore /home/mongo/test.keystore -alias test1 -file test1.cer

指定密鑰庫及需導出證書的條目,導出證書到指定的文件;執行命令後當前目錄下生成了 test1.cer 的證書文件。

3.5、列印證書內容

keytool -printcert -file test1.cer

也可以使用 -sslserver <server[:port]> 參數,直接從網路上列印某個 ssl server 的證書內容 。

3.6、導入證書

keytool -importcert -keystore /home/mongo/test.keystore -file test1.cer -alias test2

執行命令後會在密鑰庫中增加一個條目類型為 trustedCertEntry,別名為 test2 的條目。

3.7、刪除條目

keytool -delete -keystore /home/mongo/test.keystore -alias test2

執行命令後別名為 test2 的條目將被刪除。

3.8、簽發證書

先使用一個條目生成證書請求,再使用另外一個條目根據證書請求生成證書。

A、生成證書請求

keytool -certreq -keystore /home/mongo/test.keystore -alias test1 -file test1.csr

使用別名為 test1 的條目生成證書請求文件 test1.csr。

B、創建另一個密鑰對用於簽發證書

keytool -genkeypair -alias ca -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12

C、使用別名為 ca 的條目簽發證書

keytool -gencert -alias ca -keystore /home/mongo/test.keystore -infile test1.csr -outfile test2.cer

4、Java API 操作密鑰庫

可以通過 Java 代碼來訪問密鑰庫,讀取所需要的信息。

package com.abc.demo.general.keystore;

import java.io.FileInputStream;
import java.security.*;
import java.security.cert.X509Certificate;

public class KeystoreCase {
    public static void main(String[] args) throws Exception {
        KeyStore keyStore = loadKeyStore("pkcs12", "d:/test.keystore", "123456");
        //讀取私鑰
        PrivateKey privateKey = (PrivateKey) keyStore.getKey("test1", "123456".toCharArray());
        System.out.println("privateKey:" + privateKey);
        //讀取證書
        X509Certificate certificate = (X509Certificate)keyStore.getCertificate("test1");
        System.out.println("certificate:" + certificate);
        //讀取公鑰
        PublicKey publicKey = certificate.getPublicKey();
        System.out.println("publicKey:" + publicKey);

        //獲得公鑰及私鑰後,就可以通過公鑰及私鑰進行加解密操作、簽名及驗簽操作。
    }

    private static KeyStore loadKeyStore(String type, String filePath, String password) {
        KeyStore keySotre = null;
        try (FileInputStream in = new FileInputStream(filePath)) {
            keySotre = KeyStore.getInstance(type);
            keySotre.load(in, password.toCharArray());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return keySotre;
    }
}

 

 

參考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#CHDFFCBG


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 實踐環境 Odoo 14.0-20221212 (Community Edition) web_responsive-14.0.1.2.1.zip https://apps.odoo.com/apps/modules/14.0/web_responsive/ 操作步驟 1、把下載的web_respo ...
  • 1 簡介 Cloud SQL 是GCP上的關係型資料庫,常用的有三種方式來創建: (1) 界面操作 (2) 命令行 gcloud (3) Terraform 在開始之前,可以查看:《初始化一個GCP項目並用gcloud訪問操作》。 2 GCP 操作界面 登陸GCP,選擇SQL,可以創建MySQL、P ...
  • 在上一篇博客中我們有提到一個詞叫做常量,現在就來講講它常量:指的是在程式運行過程中值不會發生改變的量其實我們也有寫過,在這個輸出語句中,這個1就是常量簡單來說程式運行下去,這個1它怎麼樣也不會變成3吧變數:指的是在程式運行過程中值會發生改變的量那麼怎麼來定義一個變數呢我們先來試著定義一個x,值就先為 ...
  • Spring基本介紹02 5.簡單模擬Spring基於XML配置的程式 5.1需求說明 自己寫一個簡單的Spring容器,通過讀取beans.xml,獲取第一個Javabean:Monster的對象,給該對象屬性賦值,放入到容器中,並輸出該對象信息 也就是說,不使用spring原生框架,我們自己簡單 ...
  • 前言 C 語言是一門功能強大的專業化編程語言,深受專業程式員和業餘編程愛好者的喜愛,同時 C 語言也是當今最流行的嵌入式開發語言。大多數嵌入式項目的開發都是用 C 語言來編寫的。 既然 C 語言這麼厲害,那學習 C 語言應該用什麼軟體呢? 推薦使用 Dev-Cpp 在這我推薦初學者使用 Dev-Cp ...
  • Go語言上手(一) 這是我參與「第五屆青訓營 -後端場」筆記創作活動的的第一篇筆記。 先上代碼倉庫: WenTesla/GoLang-Study: 一個學習Go的倉庫 (github.com) 這個倉庫下放下我目前學習GO的所有筆記以及代碼,還未整理,最後會將倉庫進行整理。 基礎語法 一:類型 GO ...
  • 1. 生成6位數字隨機驗證碼 import random import string def num_code(length=6): """ 生成長度為length的數字隨機驗證碼 :param length: 驗證碼長度 :return: 驗證碼 """ return ''.join(random ...
  • 本篇主要介紹Java NIO的基本原理和主要組件 Netty是由JBOSS提供的Java開源網路應用程式框架,其底層是基於Java提供的NIO能力實現的。因此為了掌握Netty的底層原理,需要首先瞭解Java NIO的原理。 NIO簡介 電腦主要由CPU、記憶體、外存、IO設備等硬體組成,電腦執行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...