本文目录导读:

我来为您提供一个完整的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
重要提示
- 密码安全:生产环境中不要硬编码密码,使用环境变量或安全配置
- 密钥保护:妥善保管密钥库文件,定期更新证书
- 时间戳:考虑使用时间戳服务防止证书过期
- 完整性检查:始终验证签名后的JAR完整性
- 证书链:对于发布,考虑使用证书链签名
这个案例涵盖了JAR签名的完整流程,您可以根据实际需求调整参数和配置。