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
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...