Java代码签名证书申请和使用方法
- 格式:doc
- 大小:34.50 KB
- 文档页数:3
java 加签方法Java加签方法Java加签是在数据传输过程中,为数据增加一段签名,以验证数据的完整性和真实性。
在Java中,可以通过使用MessageDigest类和PrivateKey类实现加签功能。
下面将介绍如何使用Java中的加签方法。
首先,我们需要获取要加签的数据。
假设我们有一个字符串类型的数据,如下所示:```javaString data = "Hello, World!";```接下来,我们需要准备私钥,私钥用于生成签名。
私钥可以由数字证书颁发机构(CA)或其他合法机构颁发。
假设我们已经有一个私钥文件 privateKey.pem,我们可以使用下面的代码读取私钥:```javaString privateKeyPath = "path/to/privateKey.pem";String privateKeyContent = newString(Files.readAllBytes(Paths.get(privateKeyPath)));```然后,我们需要将私钥转换为Java中的PrivateKey对象。
我们可以使用Java的密钥工厂(KeyFactory)类来实现转换:```javaString privateKeyType = "RSA";PKCS8EncodedKeySpec keySpec = newPKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyContent));PrivateKey privateKey =KeyFactory.getInstance(privateKeyType).generatePrivate(keySpec);```接下来,我们使用私钥对数据进行加签。
通常使用RSA算法进行签名。
我们可以使用Java的Signature类来实现加签功能:```javaString algorithm = "SHA256withRSA";Signature signature = Signature.getInstance(algorithm);signature.initSign(privateKey);signature.update(data.getBytes());byte[] sign = signature.sign();```现在,我们已经生成了加签后的数据。
文档出处:/support/java_signing_guide.html第1步下载签名工具Step 1: Download Signing Tools如果您还没有签名工具,请到SUN公司网站免费下载:/j2se/,推荐下载JDK1.4.2或以上版本,支持Solaris SPARC/x86, Linux86 和Windows 操作系统。
If you have not already done so, download the Java 2 Software Development Kit (SDK). The latest version is available free of charge for the Solaris SPARC/x86, Linux86, and Microsoft Windows platforms from /j2se/.您将使用签名工具中的keytool, jar, jarsigner 来申请代码签名证书和数字签名您的代码。
You will be using the keytool, jar, and jarsigner to apply for your Code Signing C ertificate and sign your code.第2步申请签名证书Step 2: Enrollment(1) 生成私钥和公钥对(Keystore) Create a Keystore使用以下命令生成私钥和公钥对:To generate a public/private key pair, enter the following command, specifying a name for your keystore and an alias as well.c:\jdk1.5\bin\keytool -genkey -keyalg rsa -keystore <keystore_filename> -alias <alias_name>Keytool 会提示您输入私钥密码、您的姓名(Your name,填单位网址)、您的部门名称、单位名称、所在城市、所在省份和国家缩写(中国填:CN,其他国家填其缩写),单位名称一定要与证明文件上的名称一致,部门名称(OU)可以不填。
Java签章流程介绍在现代数字化的时代,电子签名已经成为了一种普遍的方式来确认文件的真实性和完整性。
Java提供了丰富的API和工具来实现电子签名功能。
本文将详细介绍Java签章的流程和步骤,以确保流程清晰且实用。
签章流程Java签章的流程可以分为以下几个步骤:1.准备工作:在开始签章之前,需要准备一些必要的工作,包括获取证书、创建密钥库等。
2.加载证书:需要加载用于签章的证书。
证书是由认证机构(CA)颁发的,用于验证签名者身份和确保文件的完整性。
3.创建数字签名:使用私钥对文件进行加密生成数字签名。
私钥是与公钥配对使用的密钥,只有持有私钥的人才能对文件进行数字签名。
4.将数字签名附加到文件:将生成的数字签名附加到原始文件中。
这可以通过在文件中添加特定标记或在文件末尾添加附加信息来完成。
5.验证数字签名:接收者可以使用公钥来验证文件的数字签名是否有效。
公钥是与之前加载的证书相关联的密钥。
下面将详细介绍每个步骤。
准备工作在开始签章之前,需要进行一些准备工作。
1.获取证书:需要获取一个由认证机构颁发的证书。
可以通过向认证机构申请或购买来获得。
2.创建密钥库:密钥库是用于存储私钥和相关证书的安全文件。
可以使用Java提供的keytool工具来创建密钥库。
以下是创建密钥库的示例命令:keytool -genkeypair -alias mykey -keyalg RSA -keystore keystore.jks这将创建一个名为keystore.jks的密钥库,并生成一个RSA算法的密钥对。
3.导出证书:从生成的密钥库中导出公钥证书。
可以使用以下命令导出证书:keytool -exportcert -alias mykey -keystore keystore.jks -file certificate.crt这将从keystore.jks中导出名为certificate.crt的证书文件。
加载证书在准备工作完成后,可以加载用于签章的证书。
文档出处:/support/Nokia_MIDlet_signing_guide.htmlVeriSign 和Thawte 的Java代码签名证书可以用于数字签名运行J2ME MIDlet(MIDP 2.0)代码,支持诺基亚和索爱等手机的MIDlet应用软件,运行签名后的MIDlet Suite就会显示软件发行商名称,否则会显示让用户不敢下载的警告“应用软件来源未知,继续?”。
同时,签名后访问网络等都不会弹出烦人的警告框了,让手机应用更加安全!但请注意:并不是所有手机都支持数字签名机制,Thawte Java代码签名证书对索爱手机支持多些,而VeriSign Java代码签名证书则对诺基亚手机支持多些,您可以提供使用两种证书签名的两种版本供用户选择安装,使得您的MIDlet软件适用手机范围更广和支持最多的手机型号。
本签名指南是基于Nokia Developer's Suite for J2ME 的使用指南编写,如果您还没有NDS forJ2ME,您到Nokia网站上下载NDS3.0签名工具。
或下载最新版的Carbide.j 1.5 开发工具。
请注意:您也可以直接使用Sun Java Wireless Toolkit 2.5.1 中文版来签名针对Nokia手机的MIDlet,如果您还没有此开发工具可以到SUN 网站上下载合适的开发工具同时,请一定要先参考:MIDP 2.0安全机制,充分理解MIDP 2.0的安全机制有助于签名MIDlet 的成功部署。
第1步创建Keystore和私钥Step 1. Create a Keystore and Key Pair:如图1所示,点击左边主菜单“Sign Application Package”,就会显示缺省的测试证书(default),如果您已经有了Java代码签名证书的密钥对(.sks文件)或您已经有了微软代码签名证书(.pfx)文件,则您可以点击“Import Key Pair”导入您的证书密钥对,导入时需要输入您的私钥密码。
生成 SSL 证书可以使用 Java 的 `keytool` 工具。
以下是一些基本的步骤:### 使用 keytool 生成 SSL 证书#### 步骤 1: 创建密钥库(keystore)```bashkeytool -genkey -alias your_alias -keyalg RSA -keystore your_keystore.jks -keysize 2048```这将提示你输入一些信息,如密码、姓名、组织等。
#### 步骤 2: 生成证书签名请求(CSR)```bashkeytool -certreq -alias your_alias -keystore your_keystore.jks -file your_csr_file.csr```这将生成一个 CSR 文件,它包含了你的公钥信息。
#### 步骤 3: 自签名证书```bashkeytool -export -alias your_alias -fileyour_certificate.cer -keystore your_keystore.jks```这将生成一个自签名的证书文件。
以上命令中的参数:- `your_alias` 是你为证书分配的别名。
- `your_keystore.jks` 是你的密钥库文件名。
- `your_csr_file.csr` 是证书签名请求文件名。
- `your_certificate.cer` 是自签名证书文件名。
这些命令会在命令行中运行,确保替换掉 `your_alias`、`your_keystore.jks` 等为你自己的命名和路径。
请注意,生成的证书可以用于测试或内部使用。
如果要在生产环境中使用 SSL 证书,最好从受信任的证书颁发机构(CA)获取正式证书。
微信开发之使⽤java获取签名signature ⼀、前⾔微信接⼝调⽤验证最终需要⽤到的三个参数noncestr、timestamp、signature:接下来将会给出获取这三个参数的详细代码本⽂的环境eclipse + maven本⽂使⽤到的技术HttpClient、Json字符串转map、sha1加密⼆、需要⽤到的jar包maven依赖的包有:1、HttpClient包依赖<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId><version>4.4.3</version></dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.1</version></dependency>2、json转map相关包依赖<dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency><dependency><groupId>xom</groupId><artifactId>xom</artifactId><version>1.2.5</version></dependency>三、运⾏结果四、详细代码package com.luo.util;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.UUID;import net.sf.json.JSONObject;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.ParseException;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.client.methods.HttpUriRequest;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;public class HttpXmlClient {public static String post(String url, Map<String, String> params) {DefaultHttpClient httpclient = new DefaultHttpClient();String body = null;HttpPost post = postForm(url, params);body = invoke(httpclient, post);httpclient.getConnectionManager().shutdown();return body;}public static String get(String url) {DefaultHttpClient httpclient = new DefaultHttpClient();String body = null;HttpGet get = new HttpGet(url);body = invoke(httpclient, get);httpclient.getConnectionManager().shutdown();return body;}private static String invoke(DefaultHttpClient httpclient,HttpUriRequest httpost) {HttpResponse response = sendRequest(httpclient, httpost);String body = paseResponse(response);return body;}private static String paseResponse(HttpResponse response) {HttpEntity entity = response.getEntity();String charset = EntityUtils.getContentCharSet(entity);String body = null;try {body = EntityUtils.toString(entity);} catch (ParseException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return body;}private static HttpResponse sendRequest(DefaultHttpClient httpclient,HttpUriRequest httpost) {HttpResponse response = null;try {response = httpclient.execute(httpost);} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return response;}private static HttpPost postForm(String url, Map<String, String> params) { HttpPost httpost = new HttpPost(url);List<NameValuePair> nvps = new ArrayList<NameValuePair>();Set<String> keySet = params.keySet();for (String key : keySet) {nvps.add(new BasicNameValuePair(key, params.get(key)));}try {httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));} catch (UnsupportedEncodingException e) {e.printStackTrace();}return httpost;public static void main(String[] args) {//获取access_tokenMap<String, String> params = new HashMap<String, String>();params.put("corpid","wx5f24fa0db1819ea2");params.put("corpsecret","uQtWzF0bQtl2KRHX0amekjpq8L0aO96LSpSNfctOBLRbuYPO4DUBhMn0_v2jHS-9"); String xml = HttpXmlClient.post("https:///cgi-bin/gettoken",params);JSONObject jsonMap = JSONObject.fromObject(xml);Map<String, String> map = new HashMap<String, String>();Iterator<String> it = jsonMap.keys();while(it.hasNext()) {String key = (String) it.next();String u = jsonMap.get(key).toString();map.put(key, u);}String access_token = map.get("access_token");System.out.println("access_token=" + access_token);//获取ticketparams.put("access_token",access_token);xml = HttpXmlClient.post("https:///cgi-bin/get_jsapi_ticket",params);jsonMap = JSONObject.fromObject(xml);map = new HashMap<String, String>();it = jsonMap.keys();while(it.hasNext()) {String key = (String) it.next();String u = jsonMap.get(key).toString();map.put(key, u);}String jsapi_ticket = map.get("ticket");System.out.println("jsapi_ticket=" + jsapi_ticket);//获取签名signatureString noncestr = UUID.randomUUID().toString();String timestamp = Long.toString(System.currentTimeMillis() / 1000);String url="";String str = "jsapi_ticket=" + jsapi_ticket +"&noncestr=" + noncestr +"×tamp=" + timestamp +"&url=" + url;//sha1加密String signature = SHA1(str);System.out.println("noncestr=" + noncestr);System.out.println("timestamp=" + timestamp);System.out.println("signature=" + signature);//最终获得调⽤微信js接⼝验证需要的三个参数noncestr、timestamp、signature}/*** @author:罗国辉* @date: 2015年12⽉17⽇上午9:24:43* @description: SHA、SHA1加密* @parameter: str:待加密字符串* @return:加密串**/public static String SHA1(String str) {try {MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); //如果是SHA加密只需要将"SHA-1"改成"SHA"即可digest.update(str.getBytes());byte messageDigest[] = digest.digest();// Create Hex StringStringBuffer hexStr = new StringBuffer();// 字节数组转换为⼗六进制数for (int i = 0; i < messageDigest.length; i++) {String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);if (shaHex.length() < 2) {hexStr.append(0);}hexStr.append(shaHex);}return hexStr.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}五、⼯程下载更多精彩内容请点击《》,《》欢迎⼤家学习阅读。
在Java中,你可以使用keytool命令行工具来创建和管理密钥库和证书。
下面是如何使用keytool创建一个自签名的证书的步骤:1.首先,打开命令提示符或终端。
2.使用以下命令创建一个新的密钥库(如果该文件已存在,keytool会抛出一个错误):bash复制代码keytool -genkey -alias mycert -keyalg RSA -keystore keystore.jks -keysize 2048在这个命令中:复制代码* `-genkey`表示生成密钥对。
* `-alias mycert`表示为这个证书设置一个别名"mycert"。
* `-keyalg RSA`表示使用RSA算法生成密钥对。
* `-keystore keystore.jks`表示将生成的密钥对存储在名为"keystore.jks"的文件中。
* `-keysize 2048`表示生成的密钥长度为2048位。
3. 在命令提示符或终端中,你将看到一些提示,要求你输入密钥库和密钥的密码,以及一些证书信息(如你的名字和组织)。
按照提示输入这些信息。
4. 完成后,你会看到一条消息,表示证书已经成功生成并存储在密钥库中。
5. 要查看密钥库中的证书,可以使用以下命令:bash复制代码keytool -list -alias mycert -keystore keystore.jks 这将列出与别名"mycert"关联的所有条目。
请注意,自签名证书只适用于测试和开发环境。
在生产环境中,你应该从受信任的证书颁发机构(CA)获取证书。
JA V A代码认证签名●证书导入环境:建议使用WTK2.5 + JDK1.5导入步骤:菜单Project -> Sign -> Import Key Pair 导入证书目录下的keystore.sks文件选择versign1以及thawte1证书将其导入。
请注意:在导入证书的时候,请选择安全保护域:trusted third party(可信任的第三方)。
●代码签名1.打开签名工程2.菜单Project -> Sign3.在Alias List中选择versign1或者thawte1(根据机型,Nokia一般使用versign1,索爱一般使用thawte1)4.按钮 Sign MIDlet Suite.. 签名完成注意:当前手机日期必须设置正确,在证书有效期内才能安装成功。
Versign 证书 Valid from 07-6-15 上午8:00 to 08-6-15 上午7:59Thawte 证书 Valid from 07-6-15 下午6:44 to 08-6-14 下午6:44●签名MIDlet权限对应表为了使应用能获得相应的API访问权限,必须在JAD中设定API权限设定方法为 Project -> Settings...-> Permissions在MIDlet-Permissions 中加入如下访问权限 (如果该机型不支持部分API,则需要取消这些API的权限设定,或者将这些API权限访问加在 MIDlet-Permissions-Opt 域中)部分主要权限对应如下(SMS短消息)javax.microedition.io.Connector.sms (基础必须)javax.wireless.messaging.sms.send (发送必须)javax.wireless.messaging.sms.receive (接收必须)(HTTP连接)javax.microedition.io.Connector.http(SOCKET连接)javax.microedition.io.Connector.socket(JSR75本地文件访问)javax.microedition.io.Connector.file.readjavax.microedition.io.Connector.file.write(本地非SIM卡通讯簿访问)javax.microedition.pim.ContactList.read●证书颁发代理机构网址//support/MIDlet_signing_guide.htm代理商客服MSN: cs@●证书申请流程总体流程:签订合同和提交证明材料(传真)—> 汇款—> 在线申请—> 颁发证书—> 邮寄合同正本和发票证明材料:营业执照、电话费单注意事项:首先,申请方先填写代码签名证书申请表,文件发送给发证方。
Java代码实现⽂件添加数字签名、验证数字签名Linux下实现加签、验签1.使⽤OpenSSL ⽣成公钥和密钥;#⽤ OpenSSL, Linux 上⾃带,常⽤命令如下:#⽣成 RSA 私钥(传统格式的)openssl genrsa -out rsa_private_key.pem 1024#将传统格式的私钥转换成 PKCS#8 格式的(JAVA需要使⽤的私钥需要经过PKCS#8编码,PHP程序不需要,可以直接略过)openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt#⽣成 RSA 公钥openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem2.使⽤私钥对⽂件进⾏加签、并验证#有明⽂⽂件file.txt和RSA密钥rsa_private_key.pem#使⽤md5指令指定sha1算法,对file.txt进⾏签名,⽣成签名⽂件sign1.txtopenssl md5 -sha512 -sign rsa_private_key.pem -out data_xinbao.tar.gz.sign data_xinbao.tar.gz#使⽤md5指令指定sha1算法,对file.txt进⾏签名,⽣成签名⽂件sign1.txtopenssl dgst -sha512 -sign rsa_private_key.pem -out data_xinbao.tar.gz.sign data_xinbao.tar.gz#两个签名⽂件⼀样,说明两个指令完成相同的功能diff data_xinbao.tar.gz.sign data_xinbao1.tar.gz.sign#使⽤RSA公钥验证签名(verify参数),验证成功openssl md5 -verify rsa_public_key.pem -sha512 -signature data_xinbao1.tar.gz.sign data_xinbao.tar.gzopenssl dgst -verify rsa_public_key.pem -sha512 -signature data_xinbao.tar.gz.sign data_xinbao.tar.gz3.查看OpenSSL和帮助#通过下⾯命令可以查看openssl的参数说明$ openssl dgst -options are-c to output the digest with separating colons-r to output the digest in coreutils format-d to output debug info-hex output as hex dump-binary output in binary form-sign file sign digest using private key in file-verify file verify a signature using public key in file-prverify file verify a signature using private key in file-keyform arg key file format (PEM or ENGINE)-out filename output to filename rather than stdout-signature file signature to verify-sigopt nm:v signature parameter-hmac key create hashed MAC with key-mac algorithm create MAC (not neccessarily HMAC)-macopt nm:v MAC algorithm parameters or key-engine e use engine e, possibly a hardware device.-md4 to use the md4 message digest algorithm-md5 to use the md5 message digest algorithm-ripemd160 to use the ripemd160 message digest algorithm-sha to use the sha message digest algorithm-sha1 to use the sha1 message digest algorithm-sha224 to use the sha224 message digest algorithm-sha256 to use the sha256 message digest algorithm-sha384 to use the sha384 message digest algorithm-sha512 to use the sha512 message digest algorithm-whirlpool to use the whirlpool message digest algorithm4.拿加签的原⽂件和加签后的⽂件使⽤Java代码进⾏对⽐;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import java.io.*;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Date;/*** 对⽂件加签、验签⼯具类* ⽣成私钥:openssl genrsa -out rsa_private_key.pem 1024* 私钥还不能直接被使⽤,需要进⾏PKCS#8编码:openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt* 根据私钥⽣成公钥:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem* 使⽤私钥sha512签名:openssl dgst -sha512 -sign rsa_private_key.pem -out xx.tar.gz.sign xx.tar.gz* 使⽤公钥sha512验签:openssl dgst -verify rsa_public_key.pem -sha512 -signature xx.tar.gz.sign xx.tar.gz* @author XIHONGLIE* @date 2018-03-27*/public class RsaEncrypt {/*** rsa签名* @param data 待签名的字符串* @param priKey rsa私钥字符串* @return签名结果* @throws Exception 签名失败则抛出异常*/public byte[] rsaSign(byte[] data, RSAPrivateKey priKey)throws SignatureException {try {Signature signature = Signature.getInstance("SHA512withRSA");signature.initSign(priKey);signature.update(data);byte[] signed = signature.sign();return signed;} catch (Exception e) {throw new SignatureException("RSAcontent = " + data+ "; charset = ", e);}}/*** rsa验签* @param data 被签名的内容* @param sign 签名后的结果* @param pubKey rsa公钥* @return验签结果* @throws SignatureException 验签失败,则抛异常*/public boolean verify(byte[] data, byte[] sign, RSAPublicKey pubKey)throws SignatureException {try {Signature signature = Signature.getInstance("SHA512withRSA");signature.initVerify(pubKey);signature.update(data);return signature.verify(sign);} catch (Exception e) {e.printStackTrace();throw new SignatureException("RSA验证签名[content = " + data+ "; charset = " + "; signature = " + sign + "]发⽣异常!", e);}}/*** 私钥*/private RSAPrivateKey privateKey;/*** 公钥*/private RSAPublicKey publicKey;/*** 字节数据转字符串专⽤集合*/private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/*** 获取私钥* @return当前的私钥对象*/public RSAPrivateKey getPrivateKey() {return privateKey;}/*** 获取公钥* @return当前的公钥对象*/public RSAPublicKey getPublicKey() {return publicKey;}/*** 随机⽣成密钥对*/public void genKeyPair() {KeyPairGenerator keyPairGen = null;try {keyPairGen = KeyPairGenerator.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();}keyPairGen.initialize(1024, new SecureRandom());KeyPair keyPair = keyPairGen.generateKeyPair();this.privateKey = (RSAPrivateKey) keyPair.getPrivate();this.publicKey = (RSAPublicKey) keyPair.getPublic();}/*** 从.pem⽂件中取得私钥* @param filePath ⽂件路径* @return私钥*/public String getPrivateKeyFromFile(String filePath){String strPrivateKey = "";try {BufferedReader privateKey = new BufferedReader(new FileReader(filePath));String line = "";while((line = privateKey.readLine()) != null){strPrivateKey += line;}privateKey.close();strPrivateKey = strPrivateKey.replace("-----BEGIN PRIVATE KEY-----","").replace("-----END PRIVATE KEY-----",""); }catch (Exception e){e.printStackTrace();}return strPrivateKey;}/*** 从.pem⽂件中取得公钥* @param filePath ⽂件路径* @return公钥*/public String getPublicKeyFromFile(String filePath){String strPublicKey = "";try {BufferedReader publicKey = new BufferedReader(new FileReader(filePath));String line = "";while((line = publicKey.readLine()) != null){strPublicKey += line;}publicKey.close();strPublicKey = strPublicKey.replace("-----BEGIN PUBLIC KEY-----","").replace("-----END PUBLIC KEY-----","");}catch (Exception e){e.printStackTrace();}return strPublicKey;}/*** 从字符串中加载公钥* @param publicKeyStr 公钥数据字符串* @throws Exception 加载公钥时产⽣的异常*/public void loadPublicKey(String publicKeyStr) throws Exception {try {byte[] buffer = Base64Utils.decode(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);this.publicKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("公钥⾮法");}catch (NullPointerException e) {throw new Exception("公钥数据为空");}}/*** 加载私钥* @param privateKeyStr 私钥⽂件名* @return是否成功* @throws Exception*/public void loadPrivateKey(String privateKeyStr) throws Exception {try {byte[] buffer = Base64Utils.decode(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer); KeyFactory keyFactory = KeyFactory.getInstance("RSA");this.privateKey = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) {throw new Exception("⽆此算法");} catch (InvalidKeySpecException e) {throw new Exception("私钥⾮法");} catch (NullPointerException e) {throw new Exception("私钥数据为空");}}/*** 加密过程* @param publicKey 公钥* @param plainTextData 明⽂数据* @return* @throws Exception 加密过程中的异常信息*/public byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {if (publicKey == null) {throw new Exception("加密公钥为空, 请设置");}Cipher cipher = null;try {cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(plainTextData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此加密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("加密公钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("明⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("明⽂数据已损坏");}}/*** 解密过程* @param privateKey 私钥* @param cipherData 密⽂数据* @return明⽂* @throws Exception 解密过程中的异常信息*/public byte[] decrypt(RSAPrivateKey privateKey, byte[] cipherData)throws Exception {if (privateKey == null) {throw new Exception("解密私钥为空, 请设置");}Cipher cipher = null;try {cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("⽆此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密私钥⾮法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密⽂长度⾮法");} catch (BadPaddingException e) {throw new Exception("密⽂数据已损坏");}}/*** 字节数据转⼗六进制字符串* @param data 输⼊数据* @return⼗六进制内容*/public static String byteArrayToString(byte[] data) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < data.length; i++) {// 取出字节的⾼四位作为索引得到相应的⼗六进制标识符注意⽆符号右移 stringBuilder.append(HEX_CHAR[(data[i] & 0xf0) >>> 4]);// 取出字节的低四位作为索引得到相应的⼗六进制标识符stringBuilder.append(HEX_CHAR[(data[i] & 0x0f)]);if (i < data.length - 1) {stringBuilder.append(' ');}}return stringBuilder.toString();}/*** btye转换hex函数* @param byteArray* @return*/public static String byteToHex(byte[] byteArray) {StringBuffer strBuff = new StringBuffer();for (int i = 0; i < byteArray.length; i++) {if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {strBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));} else {strBuff.append(Integer.toHexString(0xFF & byteArray[i]));}}return strBuff.toString();}/*** 以字节为单位读取⽂件,常⽤于读⼆进制⽂件,如图⽚、声⾳、影像等⽂件。
generate a self-signed certificate要生成自签名证书,可以使用 Java 的 Keytool 工具。
以下是生成自签名证书的步骤:1. 打开终端或命令提示符,并导航到 Java 的安装目录。
通常,Java 的安装目录在`C:\Program Files\Java\jre1.8.0_331`(根据实际安装路径进行调整)。
2. 进入`bin`目录,该目录包含 Keytool 工具。
3. 运行以下命令来生成密钥库和自签名证书:```keytool -genkey -alias selfsigned -keyalg RSA -validity 3650 -keystore keystore.jks```- `-genkey`:表示生成新的密钥对。
- `-alias selfsigned`:为证书指定一个别名,这里是"selfsigned"。
- `-keyalg RSA`:指定使用 RSA 算法来生成密钥对。
- `-validity 3650`:指定证书的有效期为 3650 天。
- `-keystore keystore.jks`:指定生成的密钥库文件的名称和路径。
4. 在运行命令过程中,会提示输入一些信息,如密码、证书的所有者信息等。
根据提示输入相应的信息。
5. 生成的密钥库文件(keystore.jks)将包含私钥和自签名证书。
可以使用 Keytool 工具来查看和管理密钥库。
请注意,自签名证书是由自己颁发给自己的证书,通常用于测试或内部环境。
在实际生产环境中,建议使用由受信任的证书颁发机构(CA)颁发的证书。
java 国密加签验签流程Java国密加签验签流程国密算法是我国自主研发的密码算法标准,具有高安全性和高效率的特点。
在Java中使用国密算法进行加签验签操作可以保障数据的安全性。
下面将介绍Java国密加签验签的流程。
一、加签流程1. 导入相关的类库在Java代码中,首先需要导入国密算法相关的类库。
可以使用Bouncy Castle库来实现国密算法的加签验签操作。
2. 初始化密钥使用国密算法进行加签验签操作时,首先需要初始化密钥。
可以通过KeyPairGenerator类生成密钥对,其中包括公钥和私钥。
3. 加载私钥在进行加签操作之前,需要加载私钥。
可以通过KeyFactory类的generatePrivate方法将密钥字节数组转换为私钥对象。
4. 创建签名对象使用Signature类创建签名对象,通过调用其getInstance方法并指定国密算法类型来创建签名对象。
在进行加签操作之前,需要初始化签名对象。
可以通过调用Signature类的initSign方法并传入私钥对象来初始化签名对象。
6. 更新数据对需要进行加签的数据进行更新。
可以通过Signature类的update方法传入数据字节数组来更新数据。
7. 签名使用Signature类的sign方法进行签名操作,将加签结果保存为字节数组。
二、验签流程1. 导入相关的类库同样需要导入国密算法相关的类库。
2. 加载公钥在进行验签操作之前,需要加载公钥。
可以通过KeyFactory类的generatePublic方法将公钥字节数组转换为公钥对象。
3. 创建签名对象使用Signature类创建签名对象,通过调用其getInstance方法并指定国密算法类型来创建签名对象。
在进行验签操作之前,需要初始化签名对象。
可以通过调用Signature类的initVerify方法并传入公钥对象来初始化签名对象。
5. 更新数据对需要进行验签的数据进行更新。
可以通过Signature类的update方法传入数据字节数组来更新数据。
签名证书申请和验证流程
在现代社会中,数字签名证书已经成为了保障网络安全和信息
传输的重要工具。
数字签名证书是一种用于验证数字文档真实性和
完整性的电子文件,它可以确保信息在传输过程中不被篡改或伪造。
在这篇文章中,我们将探讨签名证书的申请和验证流程。
首先,让我们来了解一下签名证书的申请流程。
签名证书通常
由可信任的第三方机构(CA,Certificate Authority)颁发,这些
机构通过验证申请者的身份和信息来确保签名证书的真实性。
申请
者需要向CA提交一份证明身份的文件,如护照或驾驶证,并填写一
份申请表格。
CA将对申请者的身份进行验证,并在验证通过后颁发
数字签名证书。
接下来是签名证书的验证流程。
当接收方收到带有数字签名的
文档时,可以通过以下步骤验证签名证书的真实性。
首先,接收方
需要获取签名证书的公钥,这通常可以从CA的网站或公共目录中获取。
然后,接收方使用公钥对签名进行解密,并使用签名者的公钥
验证签名的有效性。
如果验证通过,文档的完整性和真实性就得到
了保障。
总的来说,签名证书的申请和验证流程是一个非常重要的环节,它可以确保数字文档在传输过程中不被篡改或伪造。
通过合理的申
请和验证流程,数字签名证书可以成为网络安全的重要保障,为信
息传输提供了可靠的保障。
希望这篇文章能够帮助大家更好地了解
签名证书的申请和验证流程,从而提高网络安全意识,保护个人和
组织的信息安全。
java数字签名(签名⽣成,⽤证书验证签名)(转载序:⽹上找的好⽂章,⼀篇就把我找了⼏天的所有东西都概括进来了,真是⾮常感谢作者:李素科 其实在找资料的过程当中,主要没解决的问题在于如何获得KeyStore⽂件中的PrivateKey,本来查jsdk 1.4 api⽂档就可以知道了,但是居然从上到下看了2遍,没有发现这个⽅法:load() .......)证书(Certificate,也称public-key certificate)是⽤某种签名算法对某些内容(⽐如公钥)进⾏数字签名后得到的、可以⽤来当成信任关系中介的数字凭证。
证书发⾏机构通过发⾏证书告知证书使⽤者或实体其公钥(public-key)以及其它⼀些辅助信息。
证书在电⼦商务安全交易中有着⼴泛的应⽤,证书发⾏机构也称CA(Certificate Authority)。
应⽤证书证书在公钥加密应⽤中的作⽤是保证公钥在某些可信的机构发布,其在协议SSL、电⼦交易协议SET等⽅⾯有重要的应⽤。
图1显⽰了⼀个最简单的证书应⽤⽅法:图1 证书应⽤⽅法证书的应⽤步骤是:(1) A把⾃⼰的公钥PKA送到CA(Certificate Authority);(2) CA⽤⾃⼰的私钥和A的公钥⽣成A的证书,证书内包括CA的数字签名。
签名对象包括需要在证书中说明的内容,⽐如A的公钥、时间戳、序列号等,为了简化这⾥不妨假设证书中只有三项内容:A的公钥PKA、时间戳TIME1、序列号IDA。
那么CA发送给A的简单证书凭证可表达为:CertA=Eca[TIME1,IDA,PKA];(3) B同样把⾃⼰的公钥PKB送到CA;(4) B得到CA发布的证书CertB;(5) A告知B证书CertA;(6) B告知A证书CertB。
A、B各⾃得到对⽅证书后,利⽤从CA得到的公钥(在CA的⾃签证书中)验证彼此对⽅的证书是否有效,如果有效,那么就得到了彼此的公钥。
利⽤对⽅的公钥,可以加密数据,也可以⽤来验证对⽅的数字签名。
java p12证书生成流程Java P12证书的生成流程包括以下步骤:1. 生成私钥:使用Java的密钥库工具`keytool`生成私钥。
首先,打开命令提示符或终端,并导航到Java的安装目录。
然后,运行以下命令以生成私钥:```keytool -genkeypair -alias [alias_name] -keyalg RSA -keysize 2048 -keystore [keystore_name].jks```其中,`[alias_name]`是证书的别名,`[keystore_name]`是密钥库文件的名称。
2.生成证书签名请求(CSR):使用私钥生成证书签名请求。
运行以下命令:```keytool -certreq -alias [alias_name] -keystore[keystore_name].jks -file [csr_file].csr```其中,`[csr_file]`是用于保存证书签名请求的文件名。
3.获取证书:将CSR文件发送给证书颁发机构(CA)以获取证书。
CA 会验证您的身份,并生成数字证书。
4.导入证书:将获得的证书导入到密钥库中。
运行以下命令:```keytool -import -alias [alias_name] -file[certificate_file].cer -keystore [keystore_name].jks```其中,`[certificate_file]`是获得的证书文件名。
5.导出P12证书:将证书和私钥导出为P12格式。
运行以下命令:```keytool -importkeystore -srckeystore [keystore_name].jks -destkeystore [p12_file].p12 -srcalias [alias_name] -destalias [alias_name] -deststoretype PKCS12。
JavaHttp接⼝加签、验签操作⽅法1、业务背景最近接触了⼀些电商业务,发现在处理电商业务接⼝时,⽐如淘宝、⽀付类接⼝,接⼝双⽅为了确保数据参数在传输过程中未经过篡改,都需要对接⼝数据进⾏加签,然后在接⼝服务器端对接⼝参数进⾏验签,确保两个签名是⼀样的,验签通过之后再进⾏业务逻辑处理。
我们这⾥主要介绍⼀下处理思路,⾄于签名算法我不做过多介绍,⽹上⼀⼤堆。
2、处理思路3、实例练习接⼝双⽅经过沟通,对接⼝达成如下共识:1、注意事项,主要指接⼝的的协议、传⼊参数类型、签名算法、⽂件格式等说明2、下⾯是⼀个电商业务接⼝的真实案例,双⽅约定好了接⼝URL、业务参数、固定参数、签名以及返回数据格式接⼝调⽤时,接⼝调⽤⽅代码如下(仅供参考):package com.pcmall;import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.TreeMap;public class APITest {static String TEST_URL = "待定";static String TEST_KEY = "待定";static String TEST_SEC = "待定";public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { String result = getResult(TEST_URL, getReqParam());System.out.print(result);}private static String getReqParam() throws UnsupportedEncodingException, NoSuchAlgorithmException { TreeMap<String, String> req = new TreeMap<String, String>();req.put("a", TEST_KEY);req.put("f", "json");req.put("l", "zh_CN");req.put("m", "zhongan.repair.query");req.put("v", "1.0");req.put("i", "" + System.currentTimeMillis() / 1000);req.put("params", "{\"assignNo\":\"TEST018\"}");req.put("s", sign(req, null, TEST_SEC));StringBuilder param = new StringBuilder();for (Iterator<Map.Entry<String, String>> it = req.entrySet().iterator(); it.hasNext();) {Map.Entry<String, String> e = it.next();param.append("&").append(e.getKey()).append("=").append(URLEncoder.encode(e.getValue(), "UTF-8"));}return param.toString().substring(1);}private static String sign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret) throws NoSuchAlgorithmException, UnsupportedEncodingException { StringBuilder sb = new StringBuilder();List<String> paramNames = new ArrayList<String>(paramValues.size());paramNames.addAll(paramValues.keySet());if (ignoreParamNames != null && ignoreParamNames.size() > 0) {for (String ignoreParamName : ignoreParamNames) {paramNames.remove(ignoreParamName);}}Collections.sort(paramNames);sb.append(secret);for (String paramName : paramNames) {sb.append(paramName).append(paramValues.get(paramName));}sb.append(secret);MessageDigest md = MessageDigest.getInstance("SHA-1");return byte2hex(md.digest(sb.toString().getBytes("UTF-8")));}private static String byte2hex(byte[] bytes) {StringBuilder sign = new StringBuilder();for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(bytes[i] & 0xFF);if (hex.length() == 1) {sign.append("0");}sign.append(hex.toUpperCase());}return sign.toString();}private static String getResult(String urlStr, String content) {URL url = null;HttpURLConnection connection = null;try {url = new URL(urlStr);connection = (HttpURLConnection) url.openConnection();connection.setDoOutput(true);connection.setDoInput(true);connection.setRequestMethod("POST");connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");connection.setUseCaches(false);connection.connect();DataOutputStream out = new DataOutputStream(connection.getOutputStream());out.write(content.getBytes("UTF-8"));out.flush();out.close();BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuffer buffer = new StringBuffer();String line = "";while ((line = reader.readLine()) != null) {buffer.append(line);}reader.close();return buffer.toString();} catch (IOException e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();}}return null;}}服务器端代码如下(仅供参考):@RequestMapping("/repairTakeOrder")@ResponseBodypublic ResponseVO repairTakeOrder(@RequestBody String jsonStr) {("repairTakeOrder⼊参:" + jsonStr);ResponseVO responseVO = null;try {RepairOrder repairOrder = JackJsonUtil.toBean(jsonStr,RepairOrder.class);TreeMap<String, String> paramsMap = new TreeMap<String, String>();paramsMap.put("gsxx01", repairOrder.getGsxx01());paramsMap.put("orderType", repairOrder.getOrderType().toString());paramsMap.put("serviceNo", repairOrder.getServiceNo());paramsMap.put("vipCard", repairOrder.getVipCard());paramsMap.put("customerName", repairOrder.getCustomerName());paramsMap.put("customerPhone", repairOrder.getCustomerPhone());paramsMap.put("customerTel", repairOrder.getCustomerTel());paramsMap.put("province", repairOrder.getProvince());paramsMap.put("city", repairOrder.getCity());paramsMap.put("county", repairOrder.getCounty());paramsMap.put("address", repairOrder.getAddress());paramsMap.put("salerCode", repairOrder.getSalerCode());paramsMap.put("salerName", repairOrder.getSalerName());paramsMap.put("storeCode", repairOrder.getStoreCode());paramsMap.put("storeName", repairOrder.getStoreName());paramsMap.put("site", repairOrder.getSite());paramsMap.put("siteDesp", repairOrder.getSiteDesp());paramsMap.put("engineerCode", repairOrder.getEngineerCode());paramsMap.put("engineerName", repairOrder.getEngineerName());if (repairOrder.getServiceDate() != null) {paramsMap.put("serviceDate",DateUtils.formatDate(repairOrder.getServiceDate()));}if (repairOrder.getSalePrice() != null) {paramsMap.put("salePrice", repairOrder.getSalePrice().toString());}paramsMap.put("profitCenter", repairOrder.getProfitCenter());paramsMap.put("costCenter", repairOrder.getCostCenter());paramsMap.put("gsxx02", repairOrder.getGsxx02());paramsMap.put("returnReason", repairOrder.getReturnReason());if (repairOrder.getOriOrder() != null) {paramsMap.put("oriOrder", repairOrder.getOriOrder().toString());}if (repairOrder.getOriServiceNo() != null) {paramsMap.put("oriServiceNo", repairOrder.getOriServiceNo());}// 拼接签名原串(a=1&b=2)String paramSrc = RequestUtils.getParamSrc(paramsMap);("签名原串:" + paramSrc);//进⾏验签操作if (SignUtils.verifymd5(paramSrc, repairOrder.getSign())) {//处理业务逻辑responseVO=erpServiceImpl.repairTakeOrder(repairOrder);} else {responseVO = new ResponseVO();responseVO.setSuccess(false);responseVO.setErrorMsg("验签失败");}} catch (Exception e) {logger.error("", e);responseVO = new ResponseVO();responseVO.setSuccess(false);responseVO.setErrorMsg(StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : "后台异常");}return responseVO;}以上这篇Java Http接⼝加签、验签操作⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
java加签方法Java加签方法是指对数据进行加密生成签名的过程。
加签方法通常分为以下几个步骤:1.准备数据:首先要准备需要加签的数据,可以是一个字符串、一个文件或者一个数据流。
数据准备的方式取决于具体的业务需求。
2.选择签名算法:根据需要选择合适的签名算法。
常见的签名算法有MD5、SHA-1、SHA-256等。
3. 创建签名对象:使用Java提供的API,创建一个与选择的签名算法对应的签名对象。
4.初始化签名对象:使用私钥对签名对象进行初始化。
具体的初始化方式需要根据签名对象的实现类来确定。
5. 输入数据:通过签名对象的update(方法将数据输入到签名对象中。
可以一次性输入整个数据,也可以分块输入数据。
6. 生成签名:在输入完所有的数据后,通过调用签名对象的sign(方法生成签名。
签名的格式可以是二进制的字节数组,也可以是十六进制字符串。
7.校验签名:如果需要校验签名的有效性,可以将签名数据和原始数据提供给校验方法进行比对。
校验方法将使用公钥对签名进行解密并重新计算签名值,然后与原始签名进行比较。
下面是一个具体的示例代码,使用SHA-256算法进行加签:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class SignUtilpublic static byte[] sign(String data, String key) throws NoSuchAlgorithmExceptionMessageDigest md = MessageDigest.getInstance("SHA-256");md.update(data.getBytes();return md.digest(key.getBytes();}public static boolean verify(String data, byte[] sign, String key) throws NoSuchAlgorithmExceptionMessageDigest md = MessageDigest.getInstance("SHA-256");md.update(data.getBytes();byte[] calculatedSign = md.digest(key.getBytes();return MessageDigest.isEqual(sign, calculatedSign);}public static void main(String[] args) throws NoSuchAlgorithmExceptionString data = "Hello, world!";String key = "secret";byte[] sign = sign(data, key);System.out.println("Sign: " + bytesToString(sign));boolean verified = verify(data, sign, key);System.out.println("Verified: " + verified);}public static String bytesToString(byte[] bytes)StringBuilder sb = new StringBuilder(;for (byte b : bytes)sb.append(String.format("%02x", b));}return sb.toString(;}```上述代码中,sign(方法接收一个字符串类型的数据和一个密钥,使用SHA-256算法进行加签并返回签名的字节数组。
java代码签名和策略文件使用的一个简单示例:1.首先创建一个签名,过程如下:使用的命令为:keytool –genkey –alias friend –keypass friend4life –validity 10000 –keystore ijvmkeys其中,-alias friend 表示创建的密钥对的别名为friend-keypass friend4life表示创建的密钥对的密码为friend4life-validity 10000 表示此密钥对的生存周期为10000天-keystore ijvmkeys 表示存储密钥对的文件为当前目录下的ijvmkeys,如果没有此文件就创建一个。
创建的过程中要求输入密码,如果是第一次创建文件就输入自己的密码,如果要向一个密钥文件中添加新的密钥,就要输入已有的签名,本例密码为ijvm2ed2.创建一个.jar文件本文创建一个读取文件的类,代码如下:arg[0]为所要读取文件的文件名,此java文件名位policyTest.java利用eclipse中的菜单命令Export方式将其打包为文件policyTest.jar,要生成可执行的jar文件。
3.进行签名将第二步创建的policyTest.jar文件和第一步创建的ijvmkeys放在一个目录下。
在进行签名前,解压policyTest.jar,打开其中的META-INF文件夹,可以看到:里面只有一个名为MANIFEST.MF的文件。
现在对policyTest.jar进行代码签名,输入命令如下:其中,-keystore ijvmkeys 表示保存密钥的文件为当前目录下地ijvmkeys-storepass ijvm2ed 表示保存密钥的文件的密码为ijvm2ed-keypass friend4life 表示密钥对的密码为friend4lifepolicyTest.jar 为待签名的jar包为当前目录下的policyTest.jarfriend 表示用于签名的密钥名为friend执行了本命令后,再次解压policyTest.jar,打开META-INF文件夹,可以发现多了两个文件:FRIEND.DSA和FRIEND.SF,说明jar包已经经过了签名,如图:、4.创建策略文件策略文件用来说明被签名程序的权限,java默认的策略文件包括系统策略文件和用户自定义的策略文件,指定这两个文件默认位置的文件为java.security,它存放在系统属性java.home 目录下的lib/security下,可以用下面的java语句得到系统变量java.home:System.getProperties().getProperty("java.home");然后根据这个值找到java.security文件。
文档出处:/support/java_signing_guide.html第1步下载签名工具Step 1: Download Signing Tools如果您还没有签名工具,请到SUN公司网站免费下载:/j2se/,推荐下载JDK1.4.2或以上版本,支持Solaris SPARC/x86, Linux86 和Windows 操作系统。
If you have not already done so, download the Java 2 Software Development Kit (SDK). The latest version is available free of charge for the Solaris SPARC/x86, Linux86, and Microsoft Windows platforms from /j2se/.您将使用签名工具中的keytool, jar, jarsigner 来申请代码签名证书和数字签名您的代码。
You will be using the keytool, jar, and jarsigner to apply for your Code Signing C ertificate and sign your code.第2步申请签名证书Step 2: Enrollment(1) 生成私钥和公钥对(Keystore) Create a Keystore使用以下命令生成私钥和公钥对:To generate a public/private key pair, enter the following command, specifying a name for your keystore and an alias as well.c:\jdk1.5\bin\keytool -genkey -keyalg rsa -keystore <keystore_filename> -alias <alias_name>Keytool 会提示您输入私钥密码、您的姓名(Your name,填单位网址)、您的部门名称、单位名称、所在城市、所在省份和国家缩写(中国填:CN,其他国家填其缩写),单位名称一定要与证明文件上的名称一致,部门名称(OU)可以不填。
除国家缩写必须填CN外,其余都可以是英文或中文。
请一定要保存好您的私钥和私钥密码。
我们不会要求您提供私钥文件!Keytool prompts you to enter a password for your keystore, your name, organization, and address. The public/private key pair generated by keytool is saved to your keystore and will be used to sign Java Applets and applications. This key is never sent to Thawte and is required to sign code. Thawte encourages you to make a copy of the public/private key pair and store it in a safe deposit box or other secure location. If the key is lost or stolen, contact Thawte immediately to have it revoked.(2) 生成证书请求文件(CSR) Generate a CSR请使用如下命令生成证书请求文件(CSR):You need to generate a Certificate Signing Request (CSR) for the enrollment process, the following command requests Keytool to create a CSR for the key pair in the keystore:c:\jdk1.5\bin\keytool–certreq –file certreq.csr –keystore <keystore_filename> -alias<alias_name>请把生成的certreq.csr 文件复制和粘贴到Thawte证书在线申请页面的CSR文本框中,或直接发给维瑞客服,请等待1-2个工作日后颁发证书。
Copy the contents of the CSR and paste them directly into the VeriSign enrollment form. Open the file in a text editor that does not add extra characters (Notepad or Vi are recommended).第3步使用代码签名证书Step 3: Begin Using(1) 导入签名证书Import Thawte Codesigning Certificate一旦Thawte验证了您的真实身份,将会颁发证书给您。
您需要到Thawte网站下载您的证书,请选择PKCS #7 格式证书(PKCS #7 Certificate Chain),此证书格式含有您的证书和根证书链,Keytool 要求此格式证书,请把证书保存到您的电脑中。
Once Thawte has verified your identity, we will send a confirmation e-mail with your Sun Java Code Signing Certificate attached. Upon receipt, the attached Code Signing Certificate is saved to a file on your computer. A Code Signing Certificate is a "trust path" or "chain" back to the Thawte root certificate. This "trust path" allows your code to be validated on any standard JRE without installing any additional files.请使用如下命令导入您的证书到keystore 中,这里假设您的证书名称为:cert.cer,请同时指明详细路径,一旦成功导入证书,请及时备份您的keystore文件:To import your Sun Java Signing Code Signing Certificate into your keystore, enter the following code with the path correct name for your file (for example, “cert.cer”).c:\jdk1.5\bin\keytool -import –trustcacerts –keystore <keystore_filename> -alias <alias_name>-file cert.cer(2) 把Applet代码打包成JAR文件Bundle Applet into a JAR File请使用jar 把您的Java代码打包成JAR文件,此JAR文件包含了当前目录及其子目录的所有Applet 文件:Use jar to bundle your Applets or applications as a JAR file. This string creates a JAR fileC:\TestApplet.jar. The JAR file contains all the files under the current directory and itssub-directories.c:\jdk1.5\bin\jar cvf C:\TestApplet.jar运行后,Jar会显示:Jar responds:added manifestadding: TestApplet.class (in = 94208) (out= 20103)(deflated 78%)adding: TestHelper.class (in = 16384) (out= 779)(deflated 95%)(3) 数字签名Applet Sign Your Applet使用jarsigner签名您的JAR文件,最后的参数Mycert为Keystore中签名证书的别名:Use jarsigner to sign the JAR file with the private key you saved in your keystore.c:\jdk1.5\bin\jarsigner C:\TestApplet.jar MyCert(a) 会提示您输入私钥密码,请使用您在第1步设置的密码;At the prompt, enter the password to your keystore.(b) 请输入.jar文件的完整路径和文件名,MyCert 就是您在生成私钥和CSR时使用的别名<alias_name>;In the command syntax, TestApplet represents the name and location of your JAR file. MyCert must specify the same value that you used when generating the key pair and certificate signing request (CSR).(c) Jarsigner 会生成您的代码摘要(Hash),并把此摘要和您的签名证书添加到JAR文件中。
Jarsigner hashes your Applet or application and stores the hash in the JAR file with a copy of your Code Signing Certificate.如果您已经有了从其他电脑上备份的Keystore文件(如:wotonecs.jks),则可以使用如下命令来签名JAR文件,最后的参数wotonecs为Keystore中签名证书的别名:c:\jdk1.5\bin\jarsigner -keystore wotonecs.jks C:\TestApplet.jar wotonecs(d) 使用以下命令验证已经签名的JAR文件Verify the output of your signed JAR file.c:\jdk1.5\bin\jarsigner -verify -verbose -certs c:\TestApplet.jar一旦成功签名,就可以把已经签名的JAR文件放到网上供用户下载了,用户端的Java系统会显示您的签名证书信息,如果已经签名的文件被篡改或损坏,则系统会提醒用户并拒绝安装。