??xml version="1.0" encoding="utf-8" standalone="yes"?>综合精品久久,国产91久久久久蜜臀青青天草二 ,日韩精品中文字幕在线http://www2.blogjava.net/neumqp/category/4361.htmlzh-cnTue, 03 Jul 2007 17:11:52 GMTTue, 03 Jul 2007 17:11:52 GMT60filter得到request的body/contenthttp://www.aygfsteel.com/neumqp/archive/2006/10/25/77235.html铁?/dc:creator>铁?/author>Wed, 25 Oct 2006 09:01:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/10/25/77235.htmlhttp://www.aygfsteel.com/neumqp/comments/77235.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/10/25/77235.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/77235.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/77235.html
    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);
    }

}



]]>
java 发mailhttp://www.aygfsteel.com/neumqp/archive/2006/05/10/45516.html铁?/dc:creator>铁?/author>Wed, 10 May 2006 10:02:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/05/10/45516.htmlhttp://www.aygfsteel.com/neumqp/comments/45516.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/05/10/45516.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/45516.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/45516.html有发送h名称中文支持Q支持bytes格式附gQ附件中文支?br />
  public static boolean send(String fromName, String fromAddr, String to, String subject, String
                             body, String fileName, byte[] file) throws
      Exception {
        //发送h名称Q用base64~码Q再加上Ҏ(gu)标志
        fromName = "=?GB2312?B?" + new String(base64.encode((fromName).getBytes()))  + "?=";
    Properties props = new Properties();
    Session session = Session.getInstance(props, null);
    props.put("mail.smtp.host", Constants.mailhost);
    props.put("mail.smtp.auth", "false"); 
    Message msg = new MimeMessage(session);
      msg.setFrom(new InternetAddress(fromAddr,fromName));
//后面的BodyPart加入到此处创徏的Multipart?br />    Multipart mp = new MimeMultipart();
// Create the message part
    BodyPart messageBodyPart = new MimeBodyPart();

    // Fill the message
    messageBodyPart.setText(body);

    mp.addBodyPart(messageBodyPart);

      /*发送附?/
     if (file != null && file.length > 0) {
       //利用枚D器方便的遍历集合
         MimeBodyPart mbp = new MimeBodyPart(); 
//         File fileTmp = null;
         //得到数据?br />//         FileDataSource fds = new FileDataSource(fileTmp);
         //得到附g本nq至入BodyPart
         mbp.setDataHandler(new DataHandler(new ByteArrayDataSource(file,"application/octet-stream")));
         //得到文g名同栯入BodyPart
         mbp.setFileName(MimeUtility.encodeWord(fileName,"GB2312",null));
         mp.addBodyPart(mbp);
     }
   
    //Multipart加入C?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");

    //d认证信息
    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";
    }
}



]]>
log4j资料http://www.aygfsteel.com/neumqp/archive/2006/03/09/34478.html铁?/dc:creator>铁?/author>Thu, 09 Mar 2006 07:08:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/03/09/34478.htmlhttp://www.aygfsteel.com/neumqp/comments/34478.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/03/09/34478.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/34478.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/34478.htmlhttp://dev.csdn.net/article/82070.shtm
http://blog.csdn.net/lxblg/archive/2004/09/14/104207.aspx

]]>
rmi找不到stub问题http://www.aygfsteel.com/neumqp/archive/2006/03/08/34203.html铁?/dc:creator>铁?/author>Wed, 08 Mar 2006 03:20:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/03/08/34203.htmlhttp://www.aygfsteel.com/neumqp/comments/34203.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/03/08/34203.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/34203.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/34203.html启动server时如果遇到找不到stub问题Q原因是rmiregistry找不到stubQ而不是java com.Server找不到stubQ解x法,在stub的类同一个目录下启动rmiregistry



]]>
jni内存泄露http://www.aygfsteel.com/neumqp/archive/2006/03/02/33152.html铁?/dc:creator>铁?/author>Thu, 02 Mar 2006 03:23:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/03/02/33152.htmlhttp://www.aygfsteel.com/neumqp/comments/33152.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/03/02/33152.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/33152.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/33152.html。如果返回java不必releaseQjava?x)自己回收?BR>
 jstring jstr = env->NewStringUTF((*p).sess_id);
   ...
 env->DeleteLocalRef( jstr);

jobject jobj = env->NewObject(clazz,midInit);
return jobj;

内存泄露可以先从windows资源理器中Q看到随E序q行Q内存不断增长的势Q具体可以用hp jmeter(g)?STRONG>?/STRONG>在运行程序时Q加jvm参数 -Xrunhprof:heap=all,cutoff=0 Q生成java.hprof.txtQ用jmeter打开Q?STRONG>Metric -> Residual Objects (Count)Q可以看到未回收的对象,选中要查看的对象Q点Mark记录下要查看的对象,Window -> New Window 打开新窗口,?STRONG>Metric -> Reference Graph TreeQ?/STRONG>然后?STRONG>Find Immediately可以看到对象被哪里引用?BR>

扑և内存泄漏另一Ҏ(gu)

E序有内存泄漏的W一个迹象通常是它抛出一?OutOfMemoryErrorQ或者因为频J的垃圾攉而表现出p糕的性能。幸q的是,垃圾攉可以提供能够用来诊断内存泄漏的大量信息。如果以 -verbose:gc 或?-Xloggc 选项调用 JVMQ那么每?GC q行时在控制C或者日志文件中?x)打印出一个诊断信息,包括它所p的时间、当前堆使用情况以及(qing)恢复了多内存。记?GC 使用情况q不hq扰性,因此如果需要分析内存问题或者调优垃圾收集器Q在生环境中默认启?GC 日志是值得的?

有工具可以利?GC 日志输出q以囑Ş方式它昄出来QJTune 是q样的一U工P请参?参考资?/FONT>Q。观?GC 之后堆大的图,可以看到E序内存使用的趋ѝ对于大多数E序来说Q可以将内存使用分ؓ(f)两部分:(x)baseline 使用?current load 使用。对于服务器应用E序Qbaseline 使用是应用E序在没有Q何负荗但是已l准备好接受h时的内存使用Qcurrent load 使用是在处理hq程中用的、但是在h处理完成后会(x)释放的内存。只要负荷大体上是恒定的Q应用程序通常?x)很快达C个稳定的内存使用水^。如果在应用E序已经完成了其初始化ƈ且负h有增加的情况下,内存使用持箋增加Q那么程序就可能在处理前面的h时保留了生成的对象?


?1 昄  GC 之后应用E序堆大随着旉的变化图。上升趋势是存在内存泄漏的警CZ受(在真实的应用E序中,坡度不会(x)q么大,但是在收集了_长时间的 GC 数据后,上升势通常?x)表现得很明显。)


?1. 持箋上升的内存用趋?/B>

信有了内存泄漏后,下一步就是找出哪U对象造成了这个问题。所有内存分析器都可以生成按照对象类q行分解的堆快照。有一些很好的商业堆分析工P但是扑և内存泄漏不一定要花钱买这些工?—?内置?hprof 工具也可完成q项工作。要使用 hprof q让它跟t内存用,需要以 -Xrunhprof:heap=sites 选项调用 JVM?

清单 3 昄分解了应用程序内存用的 hprof 输出的相关部分。(hprof 工具在应用程序退出时Q或者用 kill -3 或在 Windows 中按 Ctrl+Break 时生成用分解。)注意两次快照相比Q?CODE>Map.Entry?CODE>Task ?int[] 对象有了显著增加?

请参?清单 3?/P>

清单 4 展示?hprof 输出的另一部分Q给Z Map.Entry 对象的分配点的调用堆栈信息。这个输出告诉我们哪些调用链生成?Map.Entry 对象Qƈ带有一些程序分析,扑և内存泄漏来源一般来说是相当Ҏ(gu)的?


清单 4. HPROF 输出Q显C?Map.Entry 对象的分配点


TRACE 300446:
	java.util.HashMap$Entry.<init>(<Unknown Source>:Unknown line)
	java.util.HashMap.addEntry(<Unknown Source>:Unknown line)
	java.util.HashMap.put(<Unknown Source>:Unknown line)
	java.util.Collections$SynchronizedMap.put(<Unknown Source>:Unknown line)
	com.quiotix.dummy.MapLeaker.newTask(MapLeaker.java:48)
	com.quiotix.dummy.MapLeaker.main(MapLeaker.java:64)




另外
jstring jstr = (jstring)env->CallObjectMethod(authenRequest, mid_authenReq_getSdId_S);
 env->GetStringUTFRegion(jstr,0,env->GetStringLength(jstr),authenReq.sd_id);
当jstr是nullӞenv->GetStringLength(jstr)?x)出错,Djvm崩溃


]]>
转:(x)HP-UX下用JNI讉K标准C++E序http://www.aygfsteel.com/neumqp/archive/2006/02/27/32669.html铁?/dc:creator>铁?/author>Mon, 27 Feb 2006 07:54:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/02/27/32669.htmlhttp://www.aygfsteel.com/neumqp/comments/32669.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/02/27/32669.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/32669.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/32669.html HP-UX下用JNI讉K标准C++E序

问题的关键在于用aCC~译时的参数
Ҏ(gu)HP|站上的两篇文章可以很容易的使用JNI讉K传统C++(Classical C++)E序
http://www.hp.com/products1/unix/java/infolibrary/prog_guide/JNI_java2.html 
http://forums1.itrc.hp.com/service/forums/questionanswer.do?admit=716493758+1092296929165+28353475&threadId=245738 
但是,如果代码中用到了标?/SPAN>C++,也就是用CSTL,׃(x)出现莫名其妙?/SPAN>JVM crash. 而且一般的现象是?/SPAN>string的时候出?/SPAN>

最后发现是JVM的多U程机制?/SPAN>aCC~译的缺省的多线E机制不一?/SPAN>.所以编译时需要加参数指定
ȝ说来,~译参数?/SPAN>
OPTS=-AA +z +u4 -D_RWSTD_MULTI_THREAD -D_REENTRANT -D_HPUX -D_HPUX_SOURCE -D_POSIX_C_SOURCE=199506L -D_XOPEN_SOURCE_EXTENDED 

其中,-D_RWSTD_MULTI_THREAD -D_REENTRANT 是指定多U程机制;同时必须d-D_HPUX_SOURCE 参数,否则,~译时会(x)出现奇怪的错误
q接参数?/SPAN>
-AA -b -lCsup_v2 -lstd_v2 
值得注意的是Ҏ(gu)上面所说的W二文章可知?/SPAN>-AA~译q接?/SPAN>,要连的库?/SPAN>libCsup_v2.sl?/SPAN>libstd_v2.sl(q两个库是支持标?/SPAN>C++的库),而不是第一文章中提到?/SPAN>libCsup.sl?/SPAN>libstd.sl(q两个库是支持传l?/SPAN>C++的库). 

另外,有几个碰到的问题
1. 
如果~译参数没有指定多线E机?/SPAN>,JIT(启动JVM加参?/SPAN>:-Djava.compiler=none -Xint )可以使简单的例子通过,但是有些情况下还是会(x)出错

2. 
?/SPAN>null作ؓ(f)String传入JNI native接口代码中是,使用env->GetStringUTFChars(jstring)?x)出现如下错误导致虚拟机崩?/SPAN>
Function=verify_instance_jfieldID__18jfieldIDWorkaroundSFP12klassOopDescP9_jfieldID 

3. 
在?/SPAN>String作ؓ(f)JNI的传入传出参?/SPAN>,使用GetStringUTFChars解决不了中文问题,q是?x)有q正确的解x法是使用以下两个函数
void JNU_ThrowByName(JNIEnv *env, const char *name, const char *msg) 

    jclass cls = env->FindClass(name); 
    /* if cls is NULL, an exception has already been thrown */ 
    if (cls != NULL) { 
        env->ThrowNew(cls, msg); 
    } 
    /* free the local ref */ 
    env->DeleteLocalRef(cls); 


jstring JNU_NewStringNative(JNIEnv *env, const char *str) 

  if (str==NULL) 
  { 
   return NULL; 
  } 
  jclass jcls_str = env->FindClass("java/lang/String"); 
  jmethodID jmethod_str = env->GetMethodID(jcls_str, "", "([B)V"); 

  jstring result; 
  jbyteArray bytes = 0; 
  int len; 

  if (env->EnsureLocalCapacity(2) < 0) { 
    return NULL; /* out of memory error */ 
  } 
  len = strlen(str); 
  bytes = env->NewByteArray(len); 
  if (bytes != NULL) { 
    env->SetByteArrayRegion(bytes, 0, len,(jbyte *)str); 
    result = (jstring)env->NewObject(jcls_str, jmethod_str, bytes); 
    env->DeleteLocalRef(bytes); 
    return result; 
  } /* else fall through */ 
  return NULL; 



char *JNU_GetStringNativeChars(JNIEnv *env, jstring jstr) 

    jbyteArray bytes = 0; 
    jthrowable exc; 
    char *result = 0; 
    if (env->EnsureLocalCapacity(2) < 0) { 
        return 0; /* out of memory error */ 
    } 
jclass jcls_str = env->FindClass("java/lang/String"); 
jmethodID MID_String_getBytes = env->GetMethodID(jcls_str, "getBytes", "()[B"]; 

    bytes = (jbyteArray)env->CallObjectMethod(jstr, MID_String_getBytes); 
    exc = env->ExceptionOccurred(); 
    if (!exc) { 
        jint len = env->GetArrayLength( bytes); 
        result = (char *)malloc(len + 1); 
        if (result == 0) { 
            JNU_ThrowByName(env, "java/lang/OutOfMemoryError", 
                            0); 
            env->DeleteLocalRef(bytes); 
            return 0; 
        } 
        env->GetByteArrayRegion(bytes, 0, len, (jbyte *)result); 
        result[len] = 0; /* NULL-terminate */ 
    } else { 
        env->DeleteLocalRef(exc); 
    } 
    env->DeleteLocalRef(bytes); 
    return (char*)result; 


★注意:(x)使用char *JNU_GetStringNativeChars()获得的指针用完后要显式的free().



]]>
转:(x)如何使用Axis传送附?http://www.aygfsteel.com/neumqp/archive/2006/02/20/31665.html铁?/dc:creator>铁?/author>Mon, 20 Feb 2006 08:28:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/02/20/31665.htmlhttp://www.aygfsteel.com/neumqp/comments/31665.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/02/20/31665.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/31665.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/31665.html使用Axis传送附件有两种方式Q?/P>

1. 你要传送的文g装在DataHandler中,然后DataHandler对象或DataHandler数组Q多个文件传送的时候)作ؓ(f)客户端调用函数的参数Q从客户端上传文件到服务器)Axis服务的返回类型(从服务器端下载文件到客户端)q行传输?/P>

2. q有一U方式是直接修改soap信封的内容,附件信息加到soap信封中发送?/P>

q里我们只讨论第一U方法,因ؓ(f)它实现v来非常简单。关于第二种Ҏ(gu)在Axis包的webapps/attachments/TestRf.java中有详细的原码可以参考?/P>

下面的例子是把文件从服务器端下蝲到客L(fng)Q?/P>

1.服务端程序:(x)

假设传输多个文gQ在服务器端文件取出来Qƈ文件封装在DataHandler数组中?BR>代码如下Q?/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;

上面的代码将所有的文g装在了DataHandler数组中,q返回?/P>

2. 客户端的讉KQ?/P>

代码如下Q?BR> Service service = new Service();
 Call call = (Call) service.createCall();

 URL myURL = new URL(" call.setTargetEndpointAddress(myURL); //讑֮服务的主机和位置
 call.setOperationName(new QName("urn:MyAttachServer","echoDir")); //讄要调用的服务的方?BR> QName qnameAttachment = new QName("urn:MyAttachServer","DataHandler");

 call.registerTypeMapping(DataHandler.class, qnameAttachment, JAFDataHandlerSerializerFactory.class,JAFDataHandlerDeserializerFactory.class); //为附Ӟ即DataHandlerc)创徏序列化生成器

 call.addParameter("source", XMLType.XSD_STRING ,ParameterMode.IN); //讄服务调用Ҏ(gu)的传入参数类?BR> call.setReturnType(XMLType.SOAP_ARRAY); //讄调用服务Ҏ(gu)的返回类型,׃q回的是DataHandler数组Q所以设|ؓ(f)SOAP_ARRAYcd
 javax.activation.DataHandler[] ret = (javax.activation.DataHandler[])call.invoke(new Object[]{null}); //调用Ҏ(gu)

 for (i = 0; i < ret.length; ++i)
        {
            DataHandler recDH = ret[i];
            java.io.File receivedFile = new java.io.File(recDH.getName()); //文g生成
        }

3. 服务的部|Ԍ(x)

注意Q你要在部v的时候,定义DataHandler的序列化生成器?/P>

  <service name="urn:att_STC_Server" provider="java:RPC" >
    <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>

q行java org.apache.axis.client.AdminClient %* deploy.wsddQ部|服务?/P>

]]>
转:(x)使用Java实现CAhttp://www.aygfsteel.com/neumqp/archive/2006/02/20/31605.html铁?/dc:creator>铁?/author>Mon, 20 Feb 2006 03:07:00 GMThttp://www.aygfsteel.com/neumqp/archive/2006/02/20/31605.htmlhttp://www.aygfsteel.com/neumqp/comments/31605.htmlhttp://www.aygfsteel.com/neumqp/archive/2006/02/20/31605.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/31605.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/31605.html2004-05-29 17:39:53

主题: 使用Java实现CA(?

    前面几篇文章已经把如何用Java实现一个CA基本上讲完了.但是他们都有一个特?是用户的信息都是在现场获取?不能做申请和{֏相分?今天我们要讲q的是PKCS#10证书h文g.它的作用是可以使申请和{֏相分?

    PKCS#10证书hl构中的主要信息包含了被{֏?证书甌?的主体名U?DN)和他的公?因此一个CA在获取到一个PKCS#10证书h?可以从中获取到M和签发证书有关的信息,然后用它自己的私钥签发证?

    使用BC Provider在Java中构造一个证书请求格式的对象调用其构造函数即?q个函数如下:

    PKCS10CertificationRequest(java.lang.String signatureAlgorithm, X509Name subject, java.security.PublicKey key, ASN1Set attributes, java.security.PrivateKey signingKey)

    它的参数是自{֐法,证书甌者的DN,证书甌者的公钥,额外的属性集(是要申L(fng)证书的扩展信?,甌证书者的U钥.甌证书者的U钥仅仅是用来进行一下自{֐,q不出现在证书请求中,需要自{֐的目的是保证该公钥确实ؓ(f)甌者所?

    调用该对象的getEncoded()Ҏ(gu)可以其q行DER~码,然后储存h,该对象还有另一个构造函?
    PKCS10CertificationRequest(byte[] bytes)
    q个构造函数的作用是直接从储存的DER~码中把q个对象q原出来.

    利用证书hl构q行证书{֏的代码如?q里假设CSR是一个已l获取出来的PKCS10CertificationRequestl构:

    PublicKey SubjectPublicKey = CSR.getPublicKey();
    CertificationRequestInfo CSRInfo = CSR.getCertificationRequestInfo();
    X509Name SubjectDN = CSRInfo.getSubject();
    ASN1Set Attributes = CSRInfo.getAttributes();

    q样,甌者的MDN,甌者的公钥,甌者希望在证书扩展信息中填写的属性都得到?剩下的事情就和用户在现场输入时一样了,其它的信息一般是甌者不能决定的.另外证书h格式中有一样信息没有明给出来,那就是证书的有效?q个应该单独询问用户,或者用其它的方法保存v?



[q回剙]


2004-05-28 16:46:12

主题: 使用Java实现CA(?

    前几ơ我已经基本上把如何做CA所需要的基础知识讲得差不多了,今天直接讲如何用JavaE序来实C个CA应该׃是什么太困难的事情了.

    要做CA,W一步要准备好自q证书和私?U钥如何从文仉面读取出来前面已l讲q了.从文件系l中d证书的代码如?

    CertificateFactory certCF = CertificateFactory.getInstance("X.509");
    X509Certificate caCert = certCF.generateCertificate(certBIS);

    q里cerBIS是一个InputStreamcd的对?例如一个标准的X509v3格式的证书文件所形成的输入流.

    W二步就是从用户那里获取输入,然后构造主体名U结构DN,如何构造DN上次已经说过?如何从用户那里获取输?q个不在本文讨论范围之内.

    下一步就是获取用L(fng)公钥,好和他所需要的证书对应h.也有不少CA的做法就是在q里替用L(fng)场生成一对密钥对,然后把公钥放到证书中{֏l用?q个应该看实际需要选择合适的方式.

    现在一切信息都已经准备好了,可以{֏证书?下面的代码说明了q个q程:

    //构造一个证书生成器对象

    X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();

    // 如果以上一切都正常地话,可以生成证书了
    X509Certificate cert = null;
    cert = certGen.generateX509Certificate(caPrivateKey);

    q里是上面用到的生成{֏者公钥标识的函数: 

    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;
    }

    生成M公钥标识的函数和上面的类?把AuthorityKeyIdentifier替换成SubjectKeyIdentifier可以了.

    q里要注意的?CA的公钥也是在一份证书里,q种证书的特Ҏ(gu){֏者DN和接收者DN一?也就是说,q种证书是CA自己l自己颁发的证书,也就?自签名证?,它上面的公钥是CA自n的公?用来{֐的私钥就是该公钥对应的私?一般每个CA都要有这么一份证?除非该CA不是根CA,卛_的权威性不是由它自p?而是由它的上UCA证明.但是,最后d要有一个根CA,它ؓ(f)各个安全应用E序的用h信赖.

    到这里我们已l把CA最基本的功能如何用Java实现讲完?下一ơ讲如何从PKCS#10格式证书h文g中读取出用户信息,然后直接{֏公钥.



[q回剙]


2004-05-27 15:34:59

主题: 使用Java实现CA(?

    昨天本来快写完了,l果不小心按?tab"?然后向按退格键,l果退到前一个页面了,然后全部都白写了,不爽.只好今天重新写了.

    上次我们讲到如何生成密钥?以及(qing)如何诸如公?U钥,证书{这一cd全对象在文gpȝ和内存之间来回{?q些是准备开CA的基本功,今天我们讲一下CA的基本原理以?qing)如何用主体名U结构DN(Distinguish Name)来表C每一个证书中的主?

    一份证书就是一个权威机构对一个主体的w䆾的确认的证明.即一份证书表CZ个权威机构确认了一个主体就是它自己,而不是其它的冒名替?M可以是一个个?也可以不?例如,在需要安全服务的时?需要ؓ(f)一台网站的服务器颁发证?q种证书的主体就是一台服务器.{v证书的权威机构就叫做CA,该权威机构本w也是一个主?权威机构通过对包含有待认证的M的一pd信息的待{֐证书"(TBS,to be signed)q行数字{֐来表C机构对它的认?一份包含了待认证的M的相关信息的TBS再加上CA使用自己的私钥进行签名生的字节放在一?构成了一份标准的X509证书.

    一个TBS中包含了以下q些主要信息:

    证书的版?通常?(X509v3)

    证书的序列号,RFC3280中规?每个CA必须保它颁发的每一份证书的序列号都是唯一?q且序列号只能用非负整?

    {֏?CA)的主体名U?一个DN对象.

    证书的有效期,表示Ҏ(gu)是两个时间?表示了该证书从何时开始生?何时开始作?

    待认证的M的主体名U?也是一个DN对象.

    待认证的M的公?M安全应用在确认完证书的有效性后,可以开始用该M的公钥与之进行安全通信.

    如果是X509v3证书,即版本号?的话,后面q有一个证书扩展信息字D?可以在证书里面添加一些其它的信息.

    下面我们来看一下表CZ体的M名称l构:DN.q个l就构是一个属性的集合.每个属性有属性名U和属性?它的作用是用来表示"我是?,也就是说,q个证书到底是谁颁发l谁?q个证书对应的公钥是谁拥有的.

    通常使用一个字W串来表CDNl构,q种字符串说明了q种l构中的各个属性的cd和?

    C=CN;S=BeiJing;L=BeiJing;O=PKU;OU=ICST;CN=wolfenstein

    q里C是国家和地区代码,S和L都是地区代码,S相当于省或者州q样的?L相当于城市?O是组l机构名U?OU是次U组l机构名U?CN是主体的通用?common name).在这?C,S,L{等属性的cd都是相对固定?例如C一般就是用来表C国家和地区代码,在DNl构中还可以d一些其它类型的信息,一般也都是?xxx=xxx"q样来表C的.

    下面我们来说明如何在Java语言中构造出一个主体名U对?

    BC Provider中用X509Name对象来表CDN,构造一个X509Name的步骤大体如?

    先构造两个vector对象,用来表示属性名U和属性?

    Vector oids = new Vector();
    Vector attributes = new Vector();

    然后在oidsq个用来表示属性名U的vector对象中将属性名UC个一个添加进?

    oids.addElement(X509Name.C);

    ......

    oids.addElement(X509Name.CN);

    X509Name对象里面有若q常?例如上面的X509Name.C.q有X509Name.ST{等,都可以和上面丄例子对应h.

    然后属性值添加到attributes对象?

    attributes.addElement("CN");

    ......

    attributes.addElement("Wolfenstein");

    最后就可以构造出一个X509Name对象:

    X509Name SubjectDN = new X509Name(oids, attributes);

    q样,我们的主体名U结构就立h?

    下次我们可以讲关键的部分了,那就是如何用JavaE序完成CA最重要的功?{v证书.



[q回剙]


2004-05-25 21:23:52

主题: 使用Java实现CA(一)

    通过我昨天的文章大家应该已经清楚?用Java写信息安全方面的E序需要做的准备工?好了,现在假设你已l是一个对Java语言本n比较熟?zhn)?能够用Java写一些程序的?q且q些该下载的jar包已l下载好?可以正式开工了.

    在所有的此类E序的开?无论是在cȝ构造函C也好,在初始化函数中也?,都要先来上这么一?Security.addProvider(new BouncyCastleProvider());BouncyCaslte的Providerd到系l中,q样以后pȝ在运行相关程序的时候调用的是q个Provider中的加密法.

    然后我们可以开始开CA?首先,作ؓ(f)一个CA要有自己的一对公钥和U钥,我们先要生成q么一?使用KeyPairGenerator对象可以了,调用KeyPairGenerator.getInstanceҎ(gu)可以Ҏ(gu)要生成的密钥cd来生一个合适的实例,例如常用的RSA,DSA{?然后调用该对象的initializeҎ(gu)和generateKeyPairҎ(gu)可以生一个KeyPair对象?然后调用KeyPair对象中的相应Ҏ(gu)可以获取生成的密钥对中的公钥和U钥?

    有了公钥和私钥对以后,下面的一个很现实问题是如何把它们储存v?通常我们要对q些安全对象,如公?U钥,证书{先q行~码.~码的目的是Z把结构复杂的安全对象变成字节以便存储和d,如DER~码.另外,通常q把DER~码后的字节再ơ进行base64~码,以便使字节流中所有的字节都变成可打印的字?

    在Java语言?q些安全对象基本上都有getEncoded()Ҏ(gu).例如:

    byte[] keyBytes = privateKey.getEncoded();

    q样把一个私钥进行了DER~码后的l果保存C个byte数组中了.然后可以把q个byte数组保存CQ何介质中.如果有必要的?可以使用BC Provider中的Base64~码解码器类q行~码,像q样:

    byte data[] = Base64.encode(keyBytes);

    要从文g中读取私钥则应该q样:

    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyData);
    KeyFactory kfac = KeyFactory.getInstance("RSA");
    privateKey = kfac.generatePrivate(spec);

    q里说明一?对RSAU钥q行~码׃(x)自动地按照PKCS8q行.因此d的时候将包含~码的字节数l作为PKCS8EncodedKeySpec对象的构造函数的参数可以生成一个该cd的对?然后创徏一个密钥工厂对象就可以按照要求生成一个RSAU钥?很显然这里的keyData应该是和上面的keyBytes内容相同.

    Z提高pȝ的安全?通常U钥在经qDER~码?q会(x)使用一个口令进行加?然后再储存在文gpȝ?在用私钥的时?如果没有正确的口?是无法把U钥q原出来?

    保存证书和保存私钥类?Certificate对象中也有一个getEncoded的方?

    q次pq些.大家应该可以把这些安全对象很熟练C文gpȝ和内存之间来回地折腾了吧.q对以后实现CA是很重要?下次我会(x)讲一下证书中表示M的方?DN.



[q回剙]


2004-05-24 17:23:06

主题: 使用Java开发和信息安全相关的程?/A>

    q里说的信息安全是相对于pȝ安全而言?它更侧重于加?解密,数字{֐,验证,证书{等.而系l安全主要侧重于pȝ本n是否有安全漏z?如常见的׃软g设计的不完善而导致的满天飞的~冲区溢出等{?

    Java语言中负责加密功能的部g是JCE(Java Crypto Extenstion),它用开攑ּ的思想,可以允许用户自己~写加密法的具体实现的模块{?q些东西被称为JCE Provider,JCE的提供?SUN公司本n提供了一些Provider.不过我推荐用Bouncy Castle的Provider.原因是它实现的加密算法多,q比较新的椭圆曲U?ECC)法都有??A >http://www.bouncycastle.org/可以扑ֈ你所希望?Bouncy Castle除了提供Provider本n以外,q包括了一个S/MIME和一个open pgp 的jar包只有Provider本n是必要的,后两个包是方便你~程而提供的.例如有了S/MIME包后,你就不再需要ؓ(f)诸如"加密一个字W串或者一片文章然后签?之类的很现实的应用程序写上一大堆代码?只要引用S/MIME包中的某几个c?很快可以搞?而open pgp的存?使你在用Java~写和PGP/GPG交互的程序时方便多了.

    q次先写q么多了,下次开始具体讲把这些东西搞下来后怎么开始干zd.我以我现在手头上正在做的事情告诉大家,如何做一个CA.

    有了BC Provider,开CA,真的是q么?



]]>

    // 从CA的证书中获取{֏者的M名称(DN)
    // q里有一点小技?我们要把JCE中定义的
    // 用来表示DN的对?FONT face=新宋?size=2>X500Principal
转化成在
    // BC Provider中的相应的对?FONT face=新宋?size=2>X509Name

    // 先从CA的证书中d出CA的DNq行DER~码
    DERInputStream dnStream =
                 new DERInputStream(
      new ByteArrayInputStream(
       caCert.getSubjectX500Principal().
        getEncoded()));
    // 马上又从~码后的字节中dDER~码对象
    DERConstructedSequence  dnSequence =
     (DERConstructedSequence)dnStream.readObject();
    // 利用d出来的DER~码对象创徏X509Name
    // 对象,q设|ؓ(f)证书生成器中?{֏者DN"
    certGen.setIssuerDN(new X509Name(dnSequence));
    // 讄好证书生成器中的"接收方DN"
    certGen.setSubjectDN(subjectDN);
    // 讄好一些扩展字D?包括{֏者和
    // 接收者的公钥标识
    certGen.addExtension(X509Extensions.SubjectKeyIdentifier, false,
    createSubjectKeyId(keyToCertify));
    certGen.addExtension(X509Extensions.AuthorityKeyIdentifier, false,
    createAuthorityKeyId(caCert.getPublicKey()));
    // 讄证书的有效期和序列号
    certGen.setNotBefore(startDate);
    certGen.setNotAfter(endDate);
    certGen.setSerialNumber(serialNumber);
    // 讄{֐法,本例中用MD5hash后RSA
    // {֐,q且讄好主体的公钥
    certGen.setSignatureAlgorithm("MD5withRSA");
    certGen.setPublicKey(keyToCertify);

在oracle as数据源中配load balancehttp://www.aygfsteel.com/neumqp/archive/2005/12/14/23773.html铁?/dc:creator>铁?/author>Wed, 14 Dec 2005 02:12:00 GMThttp://www.aygfsteel.com/neumqp/archive/2005/12/14/23773.htmlhttp://www.aygfsteel.com/neumqp/comments/23773.htmlhttp://www.aygfsteel.com/neumqp/archive/2005/12/14/23773.html#Feedback0http://www.aygfsteel.com/neumqp/comments/commentRss/23773.htmlhttp://www.aygfsteel.com/neumqp/services/trackbacks/23773.html其他照常

]]>
վ֩ģ壺 ӱ| | | | | | ˶| ӳ| | | | | ͭ| Ͳ| | | ͩ| ̩| | Ž| ʯ| ˮ| | ۶| ˮ| ǿ| ϳ| SHOW| | | | | | ƽ| ʢ| Ӣ| ޼| ޻| | | ˮ|