Java Jar签名案例

wen java案例 3

本文目录导读:

Java Jar签名案例

  1. 创建示例Java项目
  2. 创建META-INF清单文件
  3. 编译和打包JAR文件
  4. 生成密钥库和证书
  5. 签名JAR文件
  6. 验证签名
  7. 完整的签名脚本
  8. 使用Maven进行签名
  9. 导出证书供客户端验证
  10. 运行签名的JAR
  11. 重要提示

我来为您提供一个完整的Java JAR签名案例,包括生成密钥、创建JAR文件、签名和验证的完整流程。

创建示例Java项目

首先创建一个简单的Java程序:

HelloWorld.java

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, This is a signed JAR!");
    }
}

创建META-INF清单文件

MANIFEST.MF

Manifest-Version: 1.0
Created-By: 1.8.0_201 (Oracle Corporation)
Main-Class: HelloWorld

编译和打包JAR文件

# 编译Java文件
javac HelloWorld.java
# 创建MANIFEST.MF目录
mkdir -p META-INF
# 创建JAR文件
jar cfm HelloWorld.jar META-INF/MANIFEST.MF HelloWorld.class

生成密钥库和证书

# 使用keytool生成密钥对
# -genkeypair: 生成密钥对
# -alias: 别名
# -keyalg: 加密算法
# -keysize: 密钥长度
# -validity: 有效期(天数)
# -keystore: 密钥库文件名
keytool -genkeypair \
    -alias mykey \
    -keyalg RSA \
    -keysize 2048 \
    -validity 365 \
    -keystore mystore.keystore \
    -storepass storepassword \
    -keypass keypassword \
    -dname "CN=YourName, OU=Development, O=YourCompany, L=City, S=State, C=CN"

签名JAR文件

# 使用jarsigner签名JAR
# -keystore: 密钥库文件
# -storepass: 密钥库密码
# -keypass: 密钥密码
# -signedjar: 签名后的JAR文件名
jarsigner \
    -keystore mystore.keystore \
    -storepass storepassword \
    -keypass keypassword \
    -signedjar HelloWorld_signed.jar \
    HelloWorld.jar \
    mykey
# 或者直接签名原文件
jarsigner \
    -keystore mystore.keystore \
    -storepass storepassword \
    HelloWorld.jar \
    mykey

验证签名

# 验证JAR签名
jarsigner -verify -verbose -certs HelloWorld_signed.jar
# 或验证原JAR文件
jarsigner -verify -verbose -certs HelloWorld.jar

完整的签名脚本

sign_jar.sh (Linux/Mac)

#!/bin/bash
# 设置变量
KEYSTORE="mystore.keystore"
KEYALIAS="mykey"
STOREPASS="storepassword"
KEYPASS="keypassword"
JARFILE="HelloWorld.jar"
SIGNEDJAR="HelloWorld_signed.jar"
echo "=== JAR签名流程 ==="
# 1. 生成密钥库
echo "1. 生成密钥库..."
keytool -genkeypair \
    -alias $KEYALIAS \
    -keyalg RSA \
    -keysize 2048 \
    -validity 365 \
    -keystore $KEYSTORE \
    -storepass $STOREPASS \
    -keypass $KEYPASS \
    -dname "CN=YourName, OU=Development, O=YourCompany, L=City, S=State, C=CN"
# 2. 查看密钥库内容
echo "2. 查看密钥库内容..."
keytool -list -v -keystore $KEYSTORE -storepass $STOREPASS
# 3. 签名JAR
echo "3. 签名JAR文件..."
jarsigner \
    -keystore $KEYSTORE \
    -storepass $STOREPASS \
    -keypass $KEYPASS \
    -signedjar $SIGNEDJAR \
    $JARFILE \
    $KEYALIAS
# 4. 验证签名
echo "4. 验证JAR签名..."
jarsigner -verify -verbose -certs $SIGNEDJAR
echo "=== 完成 ==="

sign_jar.bat (Windows)

@echo off
set KEYSTORE=mystore.keystore
set KEYALIAS=mykey
set STOREPASS=storepassword
set KEYPASS=keypassword
set JARFILE=HelloWorld.jar
set SIGNEDJAR=HelloWorld_signed.jar
echo === JAR签名流程 ===
REM 1. 生成密钥库
echo 1. 生成密钥库...
keytool -genkeypair ^
    -alias %KEYALIAS% ^
    -keyalg RSA ^
    -keysize 2048 ^
    -validity 365 ^
    -keystore %KEYSTORE% ^
    -storepass %STOREPASS% ^
    -keypass %KEYPASS% ^
    -dname "CN=YourName, OU=Development, O=YourCompany, L=City, S=State, C=CN"
REM 2. 查看密钥库内容
echo 2. 查看密钥库内容...
keytool -list -v -keystore %KEYSTORE% -storepass %STOREPASS%
REM 3. 签名JAR
echo 3. 签名JAR文件...
jarsigner ^
    -keystore %KEYSTORE% ^
    -storepass %STOREPASS% ^
    -keypass %KEYPASS% ^
    -signedjar %SIGNEDJAR% ^
    %JARFILE% ^
    %KEYALIAS%
REM 4. 验证签名
echo 4. 验证JAR签名...
jarsigner -verify -verbose -certs %SIGNEDJAR%
echo === 完成 ===
pause

使用Maven进行签名

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>signed-jar</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            <!-- Maven JAR Plugin: 设置Main-Class -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>HelloWorld</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- Maven Jarsigner Plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jarsigner-plugin</artifactId>
                <executions>
                    <execution>
                        <id>sign</id>
                        <goals>
                            <goal>sign</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <keystore>${project.basedir}/mystore.keystore</keystore>
                    <alias>mykey</alias>
                    <storepass>storepassword</storepass>
                    <keypass>keypassword</keypass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

导出证书供客户端验证

# 导出证书
keytool -exportcert \
    -alias mykey \
    -keystore mystore.keystore \
    -storepass storepassword \
    -file mycert.cer
# 查看证书详细信息
keytool -printcert -file mycert.cer

运行签名的JAR

# 运行签名后的JAR
java -jar HelloWorld_signed.jar
# 或者在安全策略下运行
java -Djava.security.manager -jar HelloWorld_signed.jar

重要提示

  1. 密码安全:生产环境中不要硬编码密码,使用环境变量或安全配置
  2. 密钥保护:妥善保管密钥库文件,定期更新证书
  3. 时间戳:考虑使用时间戳服务防止证书过期
  4. 完整性检查:始终验证签名后的JAR完整性
  5. 证书链:对于发布,考虑使用证书链签名

这个案例涵盖了JAR签名的完整流程,您可以根据实际需求调整参数和配置。

抱歉,评论功能暂时关闭!