锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
聽聽聽 public void doFilter(ServletRequest request, ServletResponse response,
聽聽聽聽聽聽聽聽聽聽聽 FilterChain chain) throws IOException, ServletException {
聽聽聽聽聽聽聽 HttpServletRequest req = (HttpServletRequest) request;
聽聽聽聽聽聽聽 int length = req.getContentLength();
聽聽聽聽聽聽聽 if (length > 0) {
聽聽聽聽聽聽聽聽聽聽聽 BufferedRequestWrapper bufferedRequest = new BufferedRequestWrapper(req,length);
聽聽聽聽聽聽聽聽聽聽聽 InputStream is = bufferedRequest.getInputStream();
聽聽聽聽聽聽聽聽聽聽聽 byte[] content = new byte[length];
聽聽聽聽聽聽聽聽聽聽聽
聽聽聽聽聽聽聽聽聽聽聽 int pad = 0;
聽聽聽聽聽聽聽聽聽聽聽 while(pad < length){
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 pad += is.read(content, pad, length);
聽聽聽聽聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽聽聽聽聽聽request = bufferedRequest;
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 chain.doFilter(request, response);聽聽聽聽聽聽
聽聽聽 }
BufferedRequestWrapper .java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class BufferedRequestWrapper extends HttpServletRequestWrapper {
聽聽聽 ByteArrayInputStream bais;
聽聽聽 BufferedServletInputStream bsis;
聽聽聽 byte[] buffer;
聽聽聽 public BufferedRequestWrapper(HttpServletRequest req,int length) throws IOException {
聽聽聽聽聽聽聽 super(req);
聽聽聽聽聽聽聽 // Read InputStream and store its content in a buffer.
聽聽聽聽聽聽聽 InputStream is = req.getInputStream();
聽聽聽聽聽聽聽 buffer = new byte[length];
聽聽聽聽聽聽聽 int pad = 0;
聽聽聽聽聽聽聽 while(pad < length){
聽聽聽聽聽聽聽聽聽聽聽 pad += is.read(buffer, pad, length);
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 public ServletInputStream getInputStream() {
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 // Generate a new InputStream by stored buffer
聽聽聽聽聽聽聽聽聽聽聽 bais = new ByteArrayInputStream(buffer);
聽聽聽聽聽聽聽聽聽聽聽 // Istantiate a subclass of ServletInputStream
聽聽聽聽聽聽聽聽聽聽聽 // (Only ServletInputStream or subclasses of it are accepted by the
聽聽聽聽聽聽聽聽聽聽聽 // servlet engine!)
聽聽聽聽聽聽聽聽聽聽聽 bsis = new BufferedServletInputStream(bais);
聽聽聽聽聽聽聽 } catch (Exception ex) {
聽聽聽聽聽聽聽聽聽聽聽 ex.printStackTrace();
聽聽聽聽聽聽聽 } finally {
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 return bsis;
聽聽聽 }
}
BufferedServletInputStream .java
import java.io.*;
import javax.servlet.ServletInputStream;
/*
聽Subclass of ServletInputStream needed by the servlet engine.
聽All inputStream methods are wrapped and are delegated to
聽the ByteArrayInputStream (obtained as constructor parameter)!
聽*/
public class BufferedServletInputStream extends ServletInputStream {
聽聽聽 ByteArrayInputStream bais;
聽聽聽 public BufferedServletInputStream(ByteArrayInputStream bais) {
聽聽聽聽聽聽聽 this.bais = bais;
聽聽聽 }
聽聽聽 public int available() {
聽聽聽聽聽聽聽 return bais.available();
聽聽聽 }
聽聽聽 public int read() {
聽聽聽聽聽聽聽 return bais.read();
聽聽聽 }
聽聽聽 public int read(byte[] buf, int off, int len) {
聽聽聽聽聽聽聽 return bais.read(buf, off, len);
聽聽聽 }
}
聽聽聽 // Fill the message
聽聽聽 messageBodyPart.setText(body);
聽聽聽 mp.addBodyPart(messageBodyPart);
聽聽聽聽聽 /*鍙戦侀檮浠?/
聽聽聽聽 if (file != null && file.length > 0) {
聽聽聽聽聽聽 //鍒╃敤鏋氫婦鍣ㄦ柟渚跨殑閬嶅巻闆嗗悎
聽聽聽聽聽聽聽聽 MimeBodyPart mbp = new MimeBodyPart();聽
//聽聽聽聽聽聽聽聽 File fileTmp = null;
聽聽聽聽聽聽聽聽 //寰楀埌鏁版嵁婧?br />//聽聽聽聽聽聽聽聽 FileDataSource fds = new FileDataSource(fileTmp);
聽聽聽聽聽聽聽聽 //寰楀埌闄勪歡鏈韓騫惰嚦鍏odyPart
聽聽聽聽聽聽聽聽 mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(file,"application/octet-stream")));
聽聽聽聽聽聽聽聽 //寰楀埌鏂囦歡鍚嶅悓鏍瘋嚦鍏odyPart
聽聽聽聽聽聽聽聽 mbp.setFileName(MimeUtility.encodeWord(fileName,"GB2312",null));
聽聽聽聽聽聽聽聽 mp.addBodyPart(mbp);
聽聽聽聽 }
聽聽聽
聽聽聽 //Multipart鍔犲叆鍒頒俊浠?br />聽聽聽 msg.setContent(mp);
聽聽聽 msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
聽聽聽 msg.setSubject(subject);
聽聽聽 msg.setHeader("X-Mailer", "personal Email Sender");
聽聽聽 msg.setSentDate(new Date());
聽聽聽 Transport transport = session.getTransport("smtp");
聽聽聽 //娣誨姞璁よ瘉淇℃伅
聽聽聽 transport.connect(Constants.mailhost, Constants.user, Constants.pwd);
聽聽聽 transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
聽聽聽 transport.close();
聽聽聽 return true;
聽 }
import java.io.*;
import javax.activation.*;
public class ByteArrayDataSource implements DataSource {
聽聽聽 /** * Data to write. */
聽聽聽 private byte[] _data;
聽聽聽 /** * Content-Type. */
聽聽聽 private String _type;
聽聽聽 /* Create a datasource from an input stream */
聽聽聽 public ByteArrayDataSource(InputStream is, String type) {
聽聽聽聽聽聽聽 _type = type;
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 ByteArrayOutputStream os = new ByteArrayOutputStream();
聽聽聽聽聽聽聽聽聽聽聽 int ch;
聽聽聽聽聽聽聽聽聽聽聽 // XXX : must be made more efficient by
聽聽聽聽聽聽聽聽聽聽聽 // doing buffered reads, rather than one byte reads
聽聽聽聽聽聽聽聽聽聽聽 while ((ch = is.read()) != -1)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 os.write(ch);
聽聽聽聽聽聽聽聽聽聽聽 _data = os.toByteArray();
聽聽聽聽聽聽聽 } catch (IOException ioe) {
聽聽聽聽聽聽聽 }
聽聽聽 }
聽聽聽 /* Create a datasource from a byte array */
聽聽聽 public ByteArrayDataSource(byte[] data, String type) {
聽聽聽聽聽聽聽 _data = data;
聽聽聽聽聽聽聽 _type = type;
聽聽聽 }
聽聽聽 /* Create a datasource from a String */
聽聽聽 public ByteArrayDataSource(String data, String type) {
聽聽聽聽聽聽聽 try {
聽聽聽聽聽聽聽聽聽聽聽 // Assumption that the string contains only ascii
聽聽聽聽聽聽聽聽聽聽聽 // characters ! Else just pass in a charset into this
聽聽聽聽聽聽聽聽聽聽聽 // constructor and use it in getBytes()
聽聽聽聽聽聽聽聽聽聽聽 _data = data.getBytes("iso-8859-1");
聽聽聽聽聽聽聽 } catch (UnsupportedEncodingException uee) {
聽聽聽聽聽聽聽 }
聽聽聽聽聽聽聽 _type = type;
聽聽聽 }
聽聽聽 public InputStream getInputStream() throws IOException {
聽聽聽聽聽聽聽 if (_data == null)
聽聽聽聽聽聽聽聽聽聽聽 throw new IOException("no data");
聽聽聽聽聽聽聽 return new ByteArrayInputStream(_data);
聽聽聽 }
聽聽聽 public OutputStream getOutputStream() throws IOException {
聽聽聽聽聽聽聽 throw new IOException("cannot do this");
聽聽聽 }
聽聽聽 public String getContentType() {
聽聽聽聽聽聽聽 return _type;
聽聽聽 }
聽聽聽 public String getName() {
聽聽聽聽聽聽聽 return "dummy";
聽聽聽 }
}
鎵懼嚭鍐呭瓨娉勬紡鍙︿竴鏂規硶
紼嬪簭鏈夊唴瀛樻硠婕忕殑絎竴涓抗璞¢氬父鏄畠鎶涘嚭涓涓?OutOfMemoryError
錛屾垨鑰呭洜涓洪綣佺殑鍨冨溇鏀墮泦鑰岃〃鐜板嚭緋熺硶鐨勬ц兘銆傚垢榪愮殑鏄紝鍨冨溇鏀墮泦鍙互鎻愪緵鑳藉鐢ㄦ潵璇婃柇鍐呭瓨娉勬紡鐨勫ぇ閲忎俊鎭傚鏋滀互 -verbose:gc
鎴栬?-Xloggc
閫夐」璋冪敤 JVM錛岄偅涔堟瘡嬈?GC 榪愯鏃跺湪鎺у埗鍙頒笂鎴栬呮棩蹇楁枃浠朵腑浼氭墦鍗板嚭涓涓瘖鏂俊鎭紝鍖呮嫭瀹冩墍鑺辮垂鐨勬椂闂淬佸綋鍓嶅爢浣跨敤鎯呭喌浠ュ強鎭㈠浜嗗灝戝唴瀛樸傝褰?GC 浣跨敤鎯呭喌騫朵笉鍏鋒湁騫叉壈鎬э紝鍥犳濡傛灉闇瑕佸垎鏋愬唴瀛橀棶棰樻垨鑰呰皟浼樺瀮鍦炬敹闆嗗櫒錛屽湪鐢熶駭鐜涓粯璁ゅ惎鐢?GC 鏃ュ織鏄煎緱鐨勩?
鏈夊伐鍏峰彲浠ュ埄鐢?GC 鏃ュ織杈撳嚭騫朵互鍥懼艦鏂瑰紡灝嗗畠鏄劇ず鍑烘潵錛孞Tune 灝辨槸榪欐牱鐨勪竴縐嶅伐鍏鳳紙璇峰弬闃?鍙傝冭祫鏂?/FONT>錛夈傝瀵?GC 涔嬪悗鍫嗗ぇ灝忕殑鍥撅紝鍙互鐪嬪埌紼嬪簭鍐呭瓨浣跨敤鐨勮秼鍔褲傚浜庡ぇ澶氭暟紼嬪簭鏉ヨ錛屽彲浠ュ皢鍐呭瓨浣跨敤鍒嗕負涓ら儴鍒嗭細baseline 浣跨敤鍜?current load 浣跨敤銆傚浜庢湇鍔″櫒搴旂敤紼嬪簭錛宐aseline 浣跨敤灝辨槸搴旂敤紼嬪簭鍦ㄦ病鏈変換浣曡礋鑽楓佷絾鏄凡緇忓噯澶囧ソ鎺ュ彈璇鋒眰鏃剁殑鍐呭瓨浣跨敤錛宑urrent load 浣跨敤鏄湪澶勭悊璇鋒眰榪囩▼涓嬌鐢ㄧ殑銆佷絾鏄湪璇鋒眰澶勭悊瀹屾垚鍚庝細閲婃斁鐨勫唴瀛樸傚彧瑕佽礋鑽峰ぇ浣撲笂鏄亽瀹氱殑錛屽簲鐢ㄧ▼搴忛氬父浼氬緢蹇揪鍒頒竴涓ǔ瀹氱殑鍐呭瓨浣跨敤姘村鉤銆傚鏋滃湪搴旂敤紼嬪簭宸茬粡瀹屾垚浜嗗叾鍒濆鍖栧茍涓旇礋鑽鋒病鏈夊鍔犵殑鎯呭喌涓嬶紝鍐呭瓨浣跨敤鎸佺畫澧炲姞錛岄偅涔堢▼搴忓氨鍙兘鍦ㄥ鐞嗗墠闈㈢殑璇鋒眰鏃朵繚鐣欎簡鐢熸垚鐨勫璞°?
鍥?1 鏄劇ず GC 涔嬪悗搴旂敤紼嬪簭鍫嗗ぇ灝忛殢鐫鏃墮棿鐨勫彉鍖栧浘銆備笂鍗囪秼鍔挎槸瀛樺湪鍐呭瓨娉勬紡鐨勮紺轟俊鍙楓傦紙鍦ㄧ湡瀹炵殑搴旂敤紼嬪簭涓紝鍧″害涓嶄細榪欎箞澶э紝浣嗘槸鍦ㄦ敹闆嗕簡瓚沖闀挎椂闂寸殑 GC 鏁版嵁鍚庯紝涓婂崌瓚嬪娍閫氬父浼氳〃鐜板緱寰堟槑鏄俱傦級
紜俊鏈変簡鍐呭瓨娉勬紡鍚庯紝涓嬩竴姝ュ氨鏄壘鍑哄摢縐嶅璞¢犳垚浜嗚繖涓棶棰樸傛墍鏈夊唴瀛樺垎鏋愬櫒閮藉彲浠ョ敓鎴愭寜鐓у璞$被榪涜鍒嗚В鐨勫爢蹇収銆傛湁涓浜涘緢濂界殑鍟嗕笟鍫嗗垎鏋愬伐鍏鳳紝浣嗘槸鎵懼嚭鍐呭瓨娉勬紡涓嶄竴瀹氳鑺遍挶涔拌繖浜涘伐鍏?鈥斺?鍐呯疆鐨?hprof
宸ュ叿涔熷彲瀹屾垚榪欓」宸ヤ綔銆傝浣跨敤 hprof
騫惰瀹冭窡韙唴瀛樹嬌鐢紝闇瑕佷互 -Xrunhprof:heap=sites
閫夐」璋冪敤 JVM銆?
娓呭崟 3 鏄劇ず鍒嗚В浜嗗簲鐢ㄧ▼搴忓唴瀛樹嬌鐢ㄧ殑 hprof
杈撳嚭鐨勭浉鍏抽儴鍒嗐傦紙hprof
宸ュ叿鍦ㄥ簲鐢ㄧ▼搴忛鍑烘椂錛屾垨鑰呯敤 kill -3
鎴栧湪 Windows 涓寜 Ctrl+Break 鏃剁敓鎴愪嬌鐢ㄥ垎瑙c傦級娉ㄦ剰涓ゆ蹇収鐩告瘮錛?CODE>Map.Entry銆?CODE>Task 鍜?int[]
瀵硅薄鏈変簡鏄捐憲澧炲姞銆?
璇峰弬闃?娓呭崟 3銆?/P>
娓呭崟 4 灞曠ず浜?hprof
杈撳嚭鐨勫彟涓閮ㄥ垎錛岀粰鍑轟簡 Map.Entry
瀵硅薄鐨勫垎閰嶇偣鐨勮皟鐢ㄥ爢鏍堜俊鎭傝繖涓緭鍑哄憡璇夋垜浠摢浜涜皟鐢ㄩ摼鐢熸垚浜?Map.Entry
瀵硅薄錛屽茍甯︽湁涓浜涚▼搴忓垎鏋愶紝鎵懼嚭鍐呭瓨娉勬紡鏉ユ簮涓鑸潵璇存槸鐩稿綋瀹規槗鐨勩?
|
闂鐨勫叧閿湪浜庣敤aCC緙栬瘧鏃剁殑鍙傛暟. |
1. 灝嗕綘瑕佷紶閫佺殑鏂囦歡灝佽鍦―ataHandler涓紝鐒跺悗灝咲ataHandler瀵硅薄鎴朌ataHandler鏁扮粍錛堝涓枃浠朵紶閫佺殑鏃跺欙級浣滀負瀹㈡埛绔皟鐢ㄥ嚱鏁扮殑鍙傛暟錛堜粠瀹㈡埛绔笂浼犳枃浠跺埌鏈嶅姟鍣級Axis鏈嶅姟鐨勮繑鍥炵被鍨嬶紙浠庢湇鍔″櫒绔笅杞芥枃浠跺埌瀹㈡埛绔級榪涜浼犺緭銆?/P>
2. 榪樻湁涓縐嶆柟寮忔槸鐩存帴淇敼soap淇″皝鐨勫唴瀹癸紝灝嗛檮浠朵俊鎭姞鍒皊oap淇″皝涓彂閫併?/P>
榪欓噷鎴戜滑鍙璁虹涓縐嶆柟娉曪紝鍥犱負瀹冨疄鐜拌搗鏉ラ潪甯哥畝鍗曘傚叧浜庣浜岀鏂規硶鍦ˋxis鍖呯殑webapps/attachments/TestRf.java涓湁璇︾粏鐨勫師鐮佸彲浠ュ弬鑰冦?/P>
涓嬮潰鐨勪緥瀛愭槸鎶婃枃浠朵粠鏈嶅姟鍣ㄧ涓嬭澆鍒板鎴風錛?/P>
1.鏈嶅姟绔▼搴忥細
鍋囪浼犺緭澶氫釜鏂囦歡錛氬湪鏈嶅姟鍣ㄧ灝嗘枃浠跺彇鍑烘潵錛屽茍灝嗘枃浠跺皝瑁呭湪DataHandler鏁扮粍涓?BR>浠g爜濡備笅錛?/P>
DataHandler[] ret = new DataHandler[totalFileNum];
... ...
java.io.File myFile = new java.io.File(filePath);
if(myFile.isFile() && myFile.canRead())
{
String fname = myFile.getAbsoluteFile().getCanonicalPath();
DataHandler[0] = new DataHandler(new FileDataSource(fname));
}
... ...
return ret;
涓婇潰鐨勪唬鐮佸皢鎵鏈夌殑鏂囦歡灝佽鍦ㄤ簡DataHandler鏁扮粍涓紝騫惰繑鍥炪?/P>
2. 瀹㈡埛绔殑璁塊棶錛?/P>
浠g爜濡備笅錛?BR> Service service = new Service();
Call call = (Call) service.createCall();
call.registerTypeMapping(DataHandler.class, qnameAttachment, JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class); //涓洪檮浠訛紙鍗矰ataHandler綾伙級鍒涘緩搴忓垪鍖栫敓鎴愬櫒
call.addParameter("source", XMLType.XSD_STRING ,ParameterMode.IN); //璁劇疆鏈嶅姟璋冪敤鏂規硶鐨勪紶鍏ュ弬鏁扮被鍨?BR> call.setReturnType(XMLType.SOAP_ARRAY); //璁劇疆璋冪敤鏈嶅姟鏂規硶鐨勮繑鍥炵被鍨嬶紝鐢變簬榪斿洖鐨勬槸DataHandler鏁扮粍錛屾墍浠ヨ緗負SOAP_ARRAY綾誨瀷
javax.activation.DataHandler[] ret = (javax.activation.DataHandler[])call.invoke(new Object[]{null}); //璋冪敤鏂規硶
for (i = 0; i < ret.length; ++i)
{
DataHandler recDH = ret[i];
java.io.File receivedFile = new java.io.File(recDH.getName()); //鏂囦歡鐢熸垚
}
3. 鏈嶅姟鐨勯儴緗詫細
娉ㄦ剰錛氫綘瑕佸湪閮ㄧ講鐨勬椂鍊欙紝瀹氫箟DataHandler鐨勫簭鍒楀寲鐢熸垚鍣ㄣ?/P>
<parameter name="className" value="samples.att_STC.att_STC_Server"/>
<parameter name="allowedMethods" value="echoDir"/>
<typeMapping deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
languageSpecificType="java:javax.activation.DataHandler" qname="ns1:DataHandler"
serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</service>
</deployment>
榪愯java org.apache.axis.client.AdminClient %* deploy.wsdd錛岄儴緗叉湇鍔°?/P>
涓婚: 浣跨敤Java瀹炵幇CA(鍥? 鍓嶉潰鍑犵瘒鏂囩珷宸茬粡鎶婂浣曠敤Java瀹炵幇涓涓狢A鍩烘湰涓婅瀹屼簡.浣嗘槸浠栦滑閮芥湁涓涓壒鐐?灝辨槸鐢ㄦ埛鐨勪俊鎭兘鏄湪鐜板満鑾峰彇鐨?涓嶈兘鍋氱敵璇峰拰絳懼彂鐩稿垎紱?浠婂ぉ鎴戜滑瑕佽榪扮殑鏄疨KCS#10璇佷功璇鋒眰鏂囦歡.瀹冪殑浣滅敤灝辨槸鍙互浣跨敵璇峰拰絳懼彂鐩稿垎紱? PKCS#10璇佷功璇鋒眰緇撴瀯涓殑涓昏淇℃伅鍖呭惈浜嗚絳懼彂鑰?璇佷功鐢寵鑰?鐨勪富浣撳悕縐?DN)鍜屼粬鐨勫叕閽?鍥犳涓涓狢A鍦ㄨ幏鍙栧埌涓涓狿KCS#10璇佷功璇鋒眰鍚?灝卞彲浠ヤ粠涓幏鍙栧埌浠諱綍鍜岀鍙戣瘉涔︽湁鍏崇殑淇℃伅,鐒跺悗鐢ㄥ畠鑷繁鐨勭閽ョ鍙戣瘉涔? 浣跨敤BC Provider鍦↗ava涓瀯閫犱竴涓瘉涔﹁姹傛牸寮忕殑瀵硅薄璋冪敤鍏舵瀯閫犲嚱鏁板嵆鍙?榪欎釜鍑芥暟濡備笅: PKCS10CertificationRequest(java.lang.String signatureAlgorithm, X509Name subject, java.security.PublicKey key, ASN1Set attributes, java.security.PrivateKey signingKey) 瀹冪殑鍙傛暟鏄嚜絳懼悕綆楁硶,璇佷功鐢寵鑰呯殑DN,璇佷功鐢寵鑰呯殑鍏挜,棰濆鐨勫睘鎬ч泦(灝辨槸瑕佺敵璇風殑璇佷功鐨勬墿灞曚俊鎭?,鐢寵璇佷功鑰呯殑縐侀挜.鐢寵璇佷功鑰呯殑縐侀挜浠呬粎鏄敤鏉ヨ繘琛屼竴涓嬭嚜絳懼悕,騫朵笉鍑虹幇鍦ㄨ瘉涔﹁姹備腑,闇瑕佽嚜絳懼悕鐨勭洰鐨勬槸淇濊瘉璇ュ叕閽ョ‘瀹炰負鐢寵鑰呮墍鏈? 璋冪敤璇ュ璞$殑getEncoded()鏂規硶鍙互灝嗗叾榪涜DER緙栫爜,鐒跺悗鍌ㄥ瓨璧鋒潵,璇ュ璞¤繕鏈夊彟涓涓瀯閫犲嚱鏁? 鍒╃敤璇佷功璇鋒眰緇撴瀯榪涜璇佷功絳懼彂鐨勪唬鐮佸涓?榪欓噷鍋囪CSR鏄竴涓凡緇忚幏鍙栧嚭鏉ョ殑PKCS10CertificationRequest緇撴瀯: PublicKey SubjectPublicKey = CSR.getPublicKey(); 榪欐牱,鐢寵鑰呯殑涓諱綋DN,鐢寵鑰呯殑鍏挜,鐢寵鑰呭笇鏈涘湪璇佷功鎵╁睍淇℃伅涓~鍐欑殑灞炴ч兘寰楀埌浜?鍓╀笅鐨勪簨鎯呭氨鍜岀敤鎴峰湪鐜板満杈撳叆鏃朵竴鏍蜂簡,鍏跺畠鐨勪俊鎭竴鑸槸鐢寵鑰呬笉鑳藉喅瀹氱殑.鍙﹀璇佷功璇鋒眰鏍煎紡涓湁涓鏍蜂俊鎭病鏈夋槑紜粰鍑烘潵,閭e氨鏄瘉涔︾殑鏈夋晥鏈?榪欎釜搴旇鍗曠嫭璇㈤棶鐢ㄦ埛,鎴栬呯敤鍏跺畠鐨勬柟娉曚繚瀛樿搗鏉?
PKCS10CertificationRequest(byte[] bytes)
榪欎釜鏋勯犲嚱鏁扮殑浣滅敤灝辨槸鐩存帴浠庡偍瀛樼殑DER緙栫爜涓妸榪欎釜瀵硅薄榪樺師鍑烘潵.
CertificationRequestInfo CSRInfo = CSR.getCertificationRequestInfo();
X509Name SubjectDN = CSRInfo.getSubject();
ASN1Set Attributes = CSRInfo.getAttributes();
[榪斿洖欏墮儴]
2004-05-28 16:46:12
涓婚: 浣跨敤Java瀹炵幇CA(涓? 鍓嶅嚑嬈℃垜宸茬粡鍩烘湰涓婃妸濡備綍鍋欳A鎵闇瑕佺殑鍩虹鐭ヨ瘑璁插緱宸笉澶氫簡,浠婂ぉ鐩存帴璁插浣曠敤Java紼嬪簭鏉ュ疄鐜頒竴涓狢A搴旇灝變笉鏄粈涔堝お鍥伴毦鐨勪簨鎯呬簡. 瑕佸仛CA,絎竴姝ヨ鍑嗗濂借嚜宸辯殑璇佷功鍜岀閽?縐侀挜濡備綍浠庢枃浠墮噷闈㈣鍙栧嚭鏉ュ墠闈㈠凡緇忚榪囦簡.浠庢枃浠剁郴緇熶腑璇誨嚭璇佷功鐨勪唬鐮佸涓? CertificateFactory certCF = CertificateFactory.getInstance("X.509"); 榪欓噷cerBIS鏄竴涓狪nputStream綾誨瀷鐨勫璞?渚嬪涓涓爣鍑嗙殑X509v3鏍煎紡鐨勮瘉涔︽枃浠舵墍褰㈡垚鐨勮緭鍏ユ祦. 絎簩姝ュ氨鏄粠鐢ㄦ埛閭i噷鑾峰彇杈撳叆,鐒跺悗鏋勯犱富浣撳悕縐扮粨鏋凞N,濡備綍鏋勯燚N涓婃宸茬粡璇磋繃浜?濡備綍浠庣敤鎴烽偅閲岃幏鍙栬緭鍏?榪欎釜涓嶅湪鏈枃璁ㄨ鑼冨洿涔嬪唴. 涓嬩竴姝ュ氨鏄幏鍙栫敤鎴風殑鍏挜,濂藉拰浠栨墍闇瑕佺殑璇佷功瀵瑰簲璧鋒潵.涔熸湁涓嶅皯CA鐨勫仛娉曞氨鏄湪榪欓噷鏇跨敤鎴風幇鍦虹敓鎴愪竴瀵瑰瘑閽ュ,鐒跺悗鎶婂叕閽ユ斁鍒拌瘉涔︿腑絳懼彂緇欑敤鎴?榪欎釜搴旇鐪嬪疄闄呴渶瑕侀夋嫨鍚堥傜殑鏂瑰紡. 鐜板湪涓鍒囦俊鎭兘宸茬粡鍑嗗濂戒簡,鍙互絳懼彂璇佷功浜?涓嬮潰鐨勪唬鐮佽鏄庝簡榪欎釜榪囩▼: //鏋勯犱竴涓瘉涔︾敓鎴愬櫒瀵硅薄 X509V3CertificateGenerator certGen = new X509V3CertificateGenerator(); // 浠嶤A鐨勮瘉涔︿腑鑾峰彇絳懼彂鑰呯殑涓諱綋鍚嶇О(DN)
X509Certificate caCert = certCF.generateCertificate(certBIS);
// 榪欓噷鏈変竴鐐瑰皬鎶宸?鎴戜滑瑕佹妸JCE涓畾涔夌殑
// 鐢ㄦ潵琛ㄧずDN鐨勫璞?FONT face=鏂板畫浣?size=2>X500Principal
// BC Provider涓殑鐩稿簲鐨勫璞?FONT face=鏂板畫浣?size=2>X509Name
// 鍏堜粠CA鐨勮瘉涔︿腑璇誨彇鍑篊A鐨凞N榪涜DER緙栫爜
DERInputStream dnStream =
new DERInputStream(
new ByteArrayInputStream(
caCert.getSubjectX500Principal().
getEncoded()));
// 椹笂鍙堜粠緙栫爜鍚庣殑瀛楄妭嫻佷腑璇誨彇DER緙栫爜瀵硅薄
DERConstructedSequence dnSequence =
(DERConstructedSequence)dnStream.readObject();
// 鍒╃敤璇誨彇鍑烘潵鐨凞ER緙栫爜瀵硅薄鍒涘緩X509Name
// 瀵硅薄,騫惰緗負璇佷功鐢熸垚鍣ㄤ腑鐨?絳懼彂鑰匘N"
certGen.setIssuerDN(new X509Name(dnSequence));
// 璁劇疆濂借瘉涔︾敓鎴愬櫒涓殑"鎺ユ敹鏂笵N"
certGen.setSubjectDN(subjectDN);
// 璁劇疆濂戒竴浜涙墿灞曞瓧孌?鍖呮嫭絳懼彂鑰呭拰
// 鎺ユ敹鑰呯殑鍏挜鏍囪瘑
certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false,
createSubjectKeyId(keyToCertify));
certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false,
createAuthorityKeyId(caCert.getPublicKey()));
// 璁劇疆璇佷功鐨勬湁鏁堟湡鍜屽簭鍒楀彿
certGen.setNotBefore(startDate);
certGen.setNotAfter(endDate);
certGen.setSerialNumber(serialNumber);
// 璁劇疆絳懼悕綆楁硶,鏈緥涓嬌鐢∕D5hash鍚嶳SA
// 絳懼悕,騫朵笖璁劇疆濂戒富浣撶殑鍏挜
certGen.setSignatureAlgorithm("MD5withRSA");
certGen.setPublicKey(keyToCertify);
// 濡傛灉浠ヤ笂涓鍒囬兘姝e父鍦拌瘽,灝卞彲浠ョ敓鎴愯瘉涔︿簡
X509Certificate cert = null;
cert = certGen.generateX509Certificate(caPrivateKey);
榪欓噷鏄笂闈㈢敤鍒扮殑鐢熸垚絳懼彂鑰呭叕閽ユ爣璇嗙殑鍑芥暟:
protected AuthorityKeyIdentifier createAuthorityKeyId(PublicKey pubKey)
{
AuthorityKeyIdentifier authKeyId = null;
try
{
ByteArrayInputStream bIn = new ByteArrayInputStream(pubKey.getEncoded());
SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(
(DERConstructedSequence)new DERInputStream(bIn).readObject());
authKeyId = new AuthorityKeyIdentifier(info);
}
catch (IOException e)
{
System.err.println("Error generating SubjectKeyIdentifier: " +
e.toString());
System.exit(1);
}
return authKeyId;
}
鐢熸垚涓諱綋鍏挜鏍囪瘑鐨勫嚱鏁板拰涓婇潰鐨勭被浼?鎶夾uthorityKeyIdentifier鏇挎崲鎴怱ubjectKeyIdentifier灝卞彲浠ヤ簡.
榪欓噷瑕佹敞鎰忕殑鏄?CA鐨勫叕閽ヤ篃鏄湪涓浠借瘉涔﹂噷,榪欑璇佷功鐨勭壒鐐規槸絳懼彂鑰匘N鍜屾帴鏀惰匘N涓鏍?涔熷氨鏄,榪欑璇佷功鏄疌A鑷繁緇欒嚜宸遍鍙戠殑璇佷功,涔熷氨鏄?鑷鍚嶈瘉涔?,瀹冧笂闈㈢殑鍏挜鏄疌A鑷韓鐨勫叕閽?鐢ㄦ潵絳懼悕鐨勭閽ュ氨鏄鍏挜瀵瑰簲鐨勭閽?涓鑸瘡涓狢A閮借鏈夎繖涔堜竴浠借瘉涔?闄ら潪璇A涓嶆槸鏍笴A,鍗沖畠鐨勬潈濞佹т笉鏄敱瀹冭嚜宸辮瘉鏄?鑰屾槸鐢卞畠鐨勪笂綰A璇佹槑.浣嗘槸,鏈鍚庢誨綊瑕佹湁涓涓牴CA,瀹冧負鍚勪釜瀹夊叏搴旂敤紼嬪簭鐨勭敤鎴鋒墍淇¤禆.
鍒拌繖閲屾垜浠凡緇忔妸CA鏈鍩烘湰鐨勫姛鑳藉浣曠敤Java瀹炵幇璁插畬浜?涓嬩竴嬈¤濡備綍浠嶱KCS#10鏍煎紡璇佷功璇鋒眰鏂囦歡涓鍙栧嚭鐢ㄦ埛淇℃伅,鐒跺悗鐩存帴絳懼彂鍏挜.
2004-05-27 15:34:59
涓婚: 浣跨敤Java瀹炵幇CA(浜? 鏄ㄥぉ鏈潵蹇啓瀹屼簡,緇撴灉涓嶅皬蹇冩寜浜?tab"閿?鐒跺悗鍚戞寜閫鏍奸敭,緇撴灉閫鍒板墠涓涓〉闈簡,鐒跺悗鍏ㄩ儴閮界櫧鍐欎簡,涓嶇埥.鍙ソ浠婂ぉ閲嶆柊鍐欎簡. 涓婃鎴戜滑璁插埌濡備綍鐢熸垚瀵嗛挜瀵?浠ュ強濡備綍灝嗚濡傚叕閽?縐侀挜,璇佷功絳夎繖涓綾誨畨鍏ㄥ璞″湪鏂囦歡緋葷粺鍜屽唴瀛樹箣闂存潵鍥炶漿鎹?榪欎簺鏄噯澶囧紑CA鐨勫熀鏈姛,浠婂ぉ鎴戜滑璁蹭竴涓婥A鐨勫熀鏈師鐞嗕互鍙婂浣曚嬌鐢ㄤ富浣撳悕縐扮粨鏋凞N(Distinguish Name)鏉ヨ〃紺烘瘡涓涓瘉涔︿腑鐨勪富浣? 涓浠借瘉涔﹀氨鏄竴涓潈濞佹満鏋勫涓涓富浣撶殑韜喚鐨勭‘璁ょ殑璇佹槑.鍗充竴浠借瘉涔﹁〃紺轟竴涓潈濞佹満鏋勭‘璁や簡涓涓富浣撳氨鏄畠鑷繁,鑰屼笉鏄叾瀹冪殑鍐掑悕欏舵浛鑰?涓諱綋鍙互鏄竴涓釜浜?涔熷彲浠ヤ笉鏄?渚嬪,鍦ㄩ渶瑕佸畨鍏ㄦ湇鍔$殑鏃跺?闇瑕佷負涓鍙扮綉绔欑殑鏈嶅姟鍣ㄩ鍙戣瘉涔?榪欑璇佷功鐨勪富浣撳氨鏄竴鍙版湇鍔″櫒.絳劇講璇佷功鐨勬潈濞佹満鏋勫氨鍙仛CA,璇ユ潈濞佹満鏋勬湰韜篃鏄竴涓富浣?鏉冨▉鏈烘瀯閫氳繃瀵瑰寘鍚湁寰呰璇佺殑涓諱綋鐨勪竴緋誨垪淇℃伅鐨勫緟絳懼悕璇佷功"(TBS,to be signed)榪涜鏁板瓧絳懼悕鏉ヨ〃紺鴻鏈烘瀯瀵瑰畠鐨勮鍙?涓浠藉寘鍚簡寰呰璇佺殑涓諱綋鐨勭浉鍏充俊鎭殑TBS鍐嶅姞涓奀A浣跨敤鑷繁鐨勭閽ヨ繘琛岀鍚嶄駭鐢熺殑瀛楄妭嫻佹斁鍦ㄤ竴璧?灝辨瀯鎴愪簡涓浠芥爣鍑嗙殑X509璇佷功. 涓涓猅BS涓寘鍚簡浠ヤ笅榪欎簺涓昏淇℃伅: 璇佷功鐨勭増鏈?閫氬父鏄?(X509v3) 璇佷功鐨勫簭鍒楀彿,RFC3280涓瀹?姣忎釜CA蹇呴』紜繚瀹冮鍙戠殑姣忎竴浠借瘉涔︾殑搴忓垪鍙烽兘鏄敮涓鐨?騫朵笖搴忓垪鍙峰彧鑳戒嬌鐢ㄩ潪璐熸暣鏁? 絳懼彂鑰?CA)鐨勪富浣撳悕縐?涓涓狣N瀵硅薄. 璇佷功鐨勬湁鏁堟湡,琛ㄧず鏂規硶鏄袱涓椂闂村?琛ㄧず浜嗚璇佷功浠庝綍鏃跺紑濮嬬敓鏁?浣曟椂寮濮嬩綔搴? 寰呰璇佺殑涓諱綋鐨勪富浣撳悕縐?涔熸槸涓涓狣N瀵硅薄. 寰呰璇佺殑涓諱綋鐨勫叕閽?浠諱綍瀹夊叏搴旂敤鍦ㄧ‘璁ゅ畬璇佷功鐨勬湁鏁堟у悗,灝卞彲浠ュ紑濮嬩嬌鐢ㄨ涓諱綋鐨勫叕閽ヤ笌涔嬭繘琛屽畨鍏ㄩ氫俊. 濡傛灉鏄疿509v3璇佷功,鍗崇増鏈彿鏄?鐨勮瘽,鍚庨潰榪樻湁涓涓瘉涔︽墿灞曚俊鎭瓧孌?鍙互鍦ㄨ瘉涔﹂噷闈㈡坊鍔犱竴浜涘叾瀹冪殑淇℃伅. 涓嬮潰鎴戜滑鏉ョ湅涓涓嬭〃紺轟富浣撶殑涓諱綋鍚嶇О緇撴瀯:DN.榪欎釜緇撳氨鏋勬槸涓涓睘鎬х殑闆嗗悎.姣忎釜灞炴ф湁灞炴у悕縐板拰灞炴у?瀹冪殑浣滅敤灝辨槸鐢ㄦ潵琛ㄧず"鎴戞槸璋?,涔熷氨鏄,榪欎釜璇佷功鍒板簳鏄皝棰佸彂緇欒皝鐨?榪欎釜璇佷功瀵瑰簲鐨勫叕閽ユ槸璋佹嫢鏈夌殑. 閫氬父浣跨敤涓涓瓧絎︿覆鏉ヨ〃紺篋N緇撴瀯,榪欑瀛楃涓茶鏄庝簡榪欑緇撴瀯涓殑鍚勪釜灞炴х殑綾誨瀷鍜屽? C=CN;S=BeiJing;L=BeiJing;O=PKU;OU=ICST;CN=wolfenstein 榪欓噷C鏄浗瀹跺拰鍦板尯浠g爜,S鍜孡閮芥槸鍦板尯浠g爜,S鐩稿綋浜庣渷鎴栬呭窞榪欐牱鐨勭駭鍒?L鐩稿綋浜庡煄甯傜駭鍒?O鏄粍緇囨満鏋勫悕縐?OU鏄綰х粍緇囨満鏋勫悕縐?CN鏄富浣撶殑閫氱敤鍚?common name).鍦ㄨ繖閲?C,S,L絳夌瓑灞炴х殑綾誨瀷閮芥槸鐩稿鍥哄畾鐨?渚嬪C涓鑸氨鏄敤鏉ヨ〃紺哄浗瀹跺拰鍦板尯浠g爜,鍦―N緇撴瀯涓繕鍙互娣誨姞涓浜涘叾瀹冪被鍨嬬殑淇℃伅,涓鑸篃閮芥槸浠?xxx=xxx"榪欐牱鏉ヨ〃紺虹殑. 涓嬮潰鎴戜滑鏉ヨ鏄庡浣曞湪Java璇█涓瀯閫犲嚭涓涓富浣撳悕縐板璞? BC Provider涓嬌鐢╔509Name瀵硅薄鏉ヨ〃紺篋N,鏋勯犱竴涓猉509Name鐨勬楠ゅぇ浣撳涓? 鍏堟瀯閫犱袱涓獀ector瀵硅薄,鐢ㄦ潵琛ㄧず灞炴у悕縐板拰灞炴у? Vector oids = new Vector(); 鐒跺悗鍦╫ids榪欎釜鐢ㄦ潵琛ㄧず灞炴у悕縐扮殑vector瀵硅薄涓皢灞炴у悕縐頒竴涓竴涓坊鍔犺繘鍘? oids.addElement(X509Name.C); ...... oids.addElement(X509Name.CN); X509Name瀵硅薄閲岄潰鏈夎嫢騫插父閲?渚嬪涓婇潰鐨刋509Name.C.榪樻湁X509Name.ST絳夌瓑,閮藉彲浠ュ拰涓婇潰涓劇殑渚嬪瓙瀵瑰簲璧鋒潵. 鐒跺悗灝嗗睘鎬у兼坊鍔犲埌attributes瀵硅薄涓? attributes.addElement("CN"); ...... attributes.addElement("Wolfenstein"); 鏈鍚庡氨鍙互鏋勯犲嚭涓涓猉509Name瀵硅薄: X509Name SubjectDN = new X509Name(oids, attributes); 榪欐牱,鎴戜滑鐨勪富浣撳悕縐扮粨鏋勫氨紜珛璧鋒潵浜? 涓嬫鎴戜滑灝卞彲浠ヨ鍏抽敭鐨勯儴鍒嗕簡,閭e氨鏄浣曠敤Java紼嬪簭瀹屾垚CA鏈閲嶈鐨勫姛鑳?絳劇講璇佷功.
Vector attributes = new Vector();
[榪斿洖欏墮儴]
2004-05-25 21:23:52
涓婚: 浣跨敤Java瀹炵幇CA(涓) 閫氳繃鎴戞槰澶╃殑鏂囩珷澶у搴旇宸茬粡娓呮浜?鐢↗ava鍐欎俊鎭畨鍏ㄦ柟闈㈢殑紼嬪簭闇瑕佸仛鐨勫噯澶囧伐浣?濂戒簡,鐜板湪鍋囪浣犲凡緇忔槸涓涓Java璇█鏈韓姣旇緝鐔熸倝,鑳藉鐢↗ava鍐欎竴浜涚▼搴忕殑浜?騫朵笖榪欎簺璇ヤ笅杞界殑jar鍖呭凡緇忎笅杞藉ソ浜?鍙互姝e紡寮宸ヤ簡. 鍦ㄦ墍鏈夌殑姝ょ被紼嬪簭鐨勫紑澶?鏃犺鏄湪綾葷殑鏋勯犲嚱鏁頒腑涔熷ソ,鍦ㄥ垵濮嬪寲鍑芥暟涓篃濂?,閮借鍏堟潵涓婅繖涔堜竴鍙?Security.addProvider(new BouncyCastleProvider());灝咮ouncyCaslte鐨凱rovider娣誨姞鍒扮郴緇熶腑,榪欐牱浠ュ悗緋葷粺鍦ㄨ繍琛岀浉鍏崇▼搴忕殑鏃跺欒皟鐢ㄧ殑灝辨槸榪欎釜Provider涓殑鍔犲瘑綆楁硶. 鐒跺悗鎴戜滑灝卞彲浠ュ紑濮嬪紑CA浜?棣栧厛,浣滀負涓涓狢A瑕佹湁鑷繁鐨勪竴瀵瑰叕閽ュ拰縐侀挜,鎴戜滑鍏堣鐢熸垚榪欎箞涓瀵?浣跨敤KeyPairGenerator瀵硅薄灝卞彲浠ヤ簡,璋冪敤KeyPairGenerator.getInstance鏂規硶鍙互鏍規嵁瑕佺敓鎴愮殑瀵嗛挜綾誨瀷鏉ヤ駭鐢熶竴涓悎閫傜殑瀹炰緥,渚嬪甯哥敤鐨凴SA,DSA絳?鐒跺悗璋冪敤璇ュ璞$殑initialize鏂規硶鍜実enerateKeyPair鏂規硶灝卞彲浠ヤ駭鐢熶竴涓狵eyPair瀵硅薄浜?鐒跺悗璋冪敤KeyPair瀵硅薄涓殑鐩稿簲鏂規硶灝卞彲浠ヨ幏鍙栫敓鎴愮殑瀵嗛挜瀵逛腑鐨勫叕閽ュ拰縐侀挜浜? 鏈変簡鍏挜鍜岀閽ュ浠ュ悗,涓嬮潰鐨勪竴涓緢鐜板疄闂灝辨槸濡備綍鎶婂畠浠偍瀛樿搗鏉?閫氬父鎴戜滑瑕佸榪欎簺瀹夊叏瀵硅薄,濡傚叕閽?縐侀挜,璇佷功絳夊厛榪涜緙栫爜.緙栫爜鐨勭洰鐨勬槸涓轟簡鎶婄粨鏋勫鏉傜殑瀹夊叏瀵硅薄鍙樻垚瀛楄妭嫻佷互渚垮瓨鍌ㄥ拰璇誨彇,濡侱ER緙栫爜.鍙﹀,閫氬父榪樻妸DER緙栫爜鍚庣殑瀛楄妭嫻佸啀嬈¤繘琛宐ase64緙栫爜,浠ヤ究浣垮瓧鑺傛祦涓墍鏈夌殑瀛楄妭閮藉彉鎴愬彲鎵撳嵃鐨勫瓧鑺? 鍦↗ava璇█涓?榪欎簺瀹夊叏瀵硅薄鍩烘湰涓婇兘鏈塯etEncoded()鏂規硶.渚嬪: byte[] keyBytes = privateKey.getEncoded(); 榪欐牱灝辨妸涓涓閽ヨ繘琛屼簡DER緙栫爜鍚庣殑緇撴灉淇濆瓨鍒頒竴涓猙yte鏁扮粍涓簡.鐒跺悗灝卞彲浠ユ妸榪欎釜byte鏁扮粍淇濆瓨鍒頒換浣曚粙璐ㄤ腑.濡傛灉鏈夊繀瑕佺殑璇?鍙互浣跨敤BC Provider涓殑Base64緙栫爜瑙g爜鍣ㄧ被榪涜緙栫爜,灝卞儚榪欐牱: byte data[] = Base64.encode(keyBytes); 瑕佷粠鏂囦歡涓鍙栫閽ュ垯搴旇榪欐牱: PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyData); 榪欓噷璇存槑涓涓?瀵筊SA縐侀挜榪涜緙栫爜灝變細鑷姩鍦版寜鐓KCS8榪涜.鍥犳璇誨彇鐨勬椂鍊欏皢鍖呭惈緙栫爜鐨勫瓧鑺傛暟緇勪綔涓篜KCS8EncodedKeySpec瀵硅薄鐨勬瀯閫犲嚱鏁扮殑鍙傛暟灝卞彲浠ョ敓鎴愪竴涓綾誨瀷鐨勫璞?鐒跺悗鍒涘緩涓涓瘑閽ュ伐鍘傚璞″氨鍙互鎸夌収瑕佹眰鐢熸垚涓涓猂SA縐侀挜浜?寰堟樉鐒惰繖閲岀殑keyData搴旇鏄拰涓婇潰鐨刱eyBytes鍐呭鐩稿悓. 涓轟簡鎻愰珮緋葷粺鐨勫畨鍏ㄦ?閫氬父縐侀挜鍦ㄧ粡榪嘍ER緙栫爜鍚?榪樹細浣跨敤涓涓彛浠よ繘琛屽姞瀵?鐒跺悗鍐嶅偍瀛樺湪鏂囦歡緋葷粺涓?鍦ㄤ嬌鐢ㄧ閽ョ殑鏃跺?濡傛灉娌℃湁姝g‘鐨勫彛浠?鏄棤娉曟妸縐侀挜榪樺師鍑烘潵鐨? 淇濆瓨璇佷功鍜屼繚瀛樼閽ョ被浼?Certificate瀵硅薄涓篃鏈変竴涓猤etEncoded鐨勬柟娉? 榪欐灝辮榪欎簺.澶у搴旇鍙互鎶婅繖浜涘畨鍏ㄥ璞″緢鐔熺粌鍦頒粠鏂囦歡緋葷粺鍜屽唴瀛樹箣闂存潵鍥炲湴鎶樿吘浜嗗惂.榪欏浠ュ悗瀹炵幇CA鏄緢閲嶈鐨?涓嬫鎴戜細璁蹭竴涓嬭瘉涔︿腑琛ㄧず涓諱綋鐨勬柟娉?DN.
KeyFactory kfac = KeyFactory.getInstance("RSA");
privateKey = kfac.generatePrivate(spec);
[榪斿洖欏墮儴]
2004-05-24 17:23:06
涓婚: 浣跨敤Java寮鍙戝拰淇℃伅瀹夊叏鐩稿叧鐨勭▼搴?/A> 榪欓噷璇寸殑淇℃伅瀹夊叏鏄浉瀵逛簬緋葷粺瀹夊叏鑰岃█鐨?瀹冩洿渚ч噸浜庡姞瀵?瑙e瘑,鏁板瓧絳懼悕,楠岃瘉,璇佷功絳夌瓑.鑰岀郴緇熷畨鍏ㄤ富瑕佷晶閲嶄簬緋葷粺鏈韓鏄惁鏈夊畨鍏ㄦ紡媧?濡傚父瑙佺殑鐢變簬杞歡璁捐鐨勪笉瀹屽杽鑰屽鑷寸殑婊″ぉ椋炵殑緙撳啿鍖烘孩鍑虹瓑絳? Java璇█涓礋璐e姞瀵嗗姛鑳界殑閮ㄤ歡鏄疛CE(Java Crypto Extenstion),瀹冧嬌鐢ㄥ紑鏀懼紡鐨勬濇兂,鍙互鍏佽鐢ㄦ埛鑷繁緙栧啓鍔犲瘑綆楁硶鐨勫叿浣撳疄鐜扮殑妯″潡絳?榪欎簺涓滆タ琚О涓篔CE Provider,JCE鐨勬彁渚涜?SUN鍏徃鏈韓鎻愪緵浜嗕竴浜汸rovider.涓嶈繃鎴戞帹鑽愪嬌鐢˙ouncy Castle鐨凱rovider.鍘熷洜鏄畠瀹炵幇鐨勫姞瀵嗙畻娉曞,榪炴瘮杈冩柊鐨勬き鍦嗘洸綰?ECC)綆楁硶閮芥湁浜?鍘?A >http://www.bouncycastle.org/
榪欐鍏堝啓榪欎箞澶氫簡,涓嬫寮濮嬪叿浣撹鎶婅繖浜涗笢瑗挎悶涓嬫潵鍚庢庝箞寮濮嬪共媧誨惂.鎴戜互鎴戠幇鍦ㄦ墜澶翠笂姝e湪鍋氱殑浜嬫儏鍛婅瘔澶у,濡備綍鍋氫竴涓狢A.
鏈変簡BC Provider,寮CA,鐪熺殑灝辨槸榪欎箞綆鍗?