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)颁发的证书。
文档出处:/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系统会显示您的签名证书信息,如果已经签名的文件被篡改或损坏,则系统会提醒用户并拒绝安装。