2014-10-15 2 views
0

Jsch를 사용하여 Java 서블릿에 보안 FTP를 설정하고 Windows에서 실행하고 Eclipse에서 개발했습니다. 그래서 현재 SFTP 세부 사항, 즉 사용자 이름 등을 데이터베이스 테이블에 저장하여 텍스트 파일에 배치 한 Windows 레지스트리의 HostKey 값과 내가 가지고있는 텍스트 파일의 위치를 ​​제외하고 보안 설정을 구성 할 수 있습니다. 필드에 표시됩니다. SFTP 세부 정보를 객체로 얻은 후 다음 코드는 텍스트 파일에서 HostKey를 가져옵니다.데이터베이스에서 Jsch HostKey 값을 읽는 방법

String SFTPFile = SFTPD.getSftp_file(); 
jsch.setKnownHosts(SFTPFile); 

이 잘 작동하지만 나는 텍스트 파일을 손상, 제거 또는 변조에 취약하기 때문에뿐만 아니라 데이터베이스에 호스트 키를 읽고 싶어. 나는 다음을 시도했다.

InputStream IS = new ByteArrayInputStream(SFTPD.getSftp_hostkey().getBytes()); 
Channel channel = null; 
ChannelSftp channelsftp = null; 
JSch jsch = new JSch(); 
com.jcraft.jsch.Session session = jsch.getSession(SFTPUsername, SFTPHost, SFTPPort); 

    try { 
     session.setPassword(SFTPPassword); 
     jsch.setKnownHosts(IS); 
     session.connect(); 
     channel = session.openChannel("sftp"); 
     channel.connect(); 
     channelsftp = (ChannelSftp)channel; 

하지만 디버깅 할 때 아래 오류가 발생합니다. 이 문제를 해결하고 테이블에서 값을 읽으려면 어떻게해야합니까?

15-Oct-2014 14:45:02 com.sun.xml.ws.transport.http.servlet.WSServletDelegate doGet 
SEVERE: caught throwable 
javax.xml.ws.WebServiceException: com.ctc.wstx.exc.WstxIOException: null 
    at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:130) 
    at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:285) 
    at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:421) 
    at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:99) 
    at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:650) 
    at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) 
    at com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync 
    (ServletAdapter.java:218) 
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet 
    (WSServletDelegate.java:159) 
    at com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost 
    (WSServletDelegate.java:194) 
    at com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:80) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter 
    (ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter 
    (ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke 
    (StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke 
    (StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke 
    (AuthenticatorBase.java:581) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process 
     (AbstractHttp11Processor.java:1001) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process 
     (AbstractProtocol.java:585) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.ctc.wstx.exc.WstxIOException: null 
    at com.ctc.wstx.sw.BaseStreamWriter.writeCharacters(BaseStreamWriter.java:511) 
    at com.sun.xml.ws.util.xml.XMLStreamWriterFilter.writeCharacters 
    (XMLStreamWriterFilter.java:99) 

답변

0

나는 이것을 해결할 수 있었다고 생각합니다. 첫 번째 테스트가 성공적으로 수행됩니다. 대신에;

InputStream IS = new ByteArrayInputStream(SFTPD.getSftp_hostkey().getBytes()); 

수입에 java.nio.charset.Charset을 추가하고이를 다음과 같이 변경했습니다. 또한

String SFTPHostKey = SFTPD.getSftp_hostkey(); 
InputStream IS = new ByteArrayInputStream(SFTPHostKey.getBytes(Charset.forName("UTF- 
    8"))); 

, 노트, 호스트 키를 잡고 데이터베이스 필드는 VARCHAR2 크기 255

입니다
관련 문제