質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

受付中

JavaでSSLSocketを使いFTPS(explicit)でファイルをSTORしたい

teratail_user
teratail_user

総合スコア14

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

2回答

1評価

1クリップ

12280閲覧

投稿2015/11/01 23:57

javaの業務で、ファイルを他サーバーに転送しなくちゃなのですが、できなくて困っています。
転送先のサーバがFTPはFTPSのみ受け付けている、という状態です。
大変困っています。ご回答お待ちしています。よろしくお願い致します。

以下のようなコードを書きましたが、
ハンドシェイクに失敗します。

code

Socket ctrlSocket; PrintWriter ctrlOutput; BufferedReader ctrlInput; byte[] localHostAddress; char[] inbuffer; int i; String sendCommand; try { // FTPサーバーへ接続します ctrlSocket = new Socket(host, port); localHostAddress = ctrlSocket.getLocalAddress().getAddress(); ctrlOutput = new PrintWriter(ctrlSocket.getOutputStream()); ctrlInput = new BufferedReader(new InputStreamReader(ctrlSocket.getInputStream())); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); // 暗号化する場合(FTPS) if (isEncrypt) { sendCommand = "AUTH TLS"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); ★ SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); ctrlSocket = (SSLSocket) factory.createSocket(ctrlSocket, host, port, true); ☆ ((SSLSocket)ctrlSocket).startHandshake(); sendCommand = "PBSZ 0"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); sendCommand = "PROT P"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); } if (isPasv) { sendCommand = "PASV"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); } // ユーザー認証します sendCommand = "USER " + userName; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); sendCommand = "PASS " + password; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); // 指定したディレクトリに移動します sendCommand = "CWD /"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); // バイナリモードに変更します sendCommand = "TYPE I"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); // アップロードします Socket dataSocket = dataConnection("STOR " + uploadPath); OutputStream outstr = dataSocket.getOutputStream(); byte[] buf = readFileToByte(inputPath); outstr.write(buf); outstr.flush(); dataSocket.close(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); // 終了 sendCommand = "QUIT"; ctrlOutput.println(sendCommand); ctrlOutput.flush(); inbuffer = new char[1000]; i = ctrlInput.read(inbuffer); 以下略

【状況】
★factoryの中身
c53d99[SSL_NULL_WITH_NULL_NULL: Socket[addr=ホスト/IPアドレス,port=21,localport=58782]]

☆を実行したあとExceptionが発生します
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

※FTPSではない、暗号化してないFTP通信ではファイル転送に成功しています。

通信相手はショッピングモールの「ポンパレモール」の店舗向けFTPサーバになります。
また、FTPソフトの「winSCP」や「FFFTP」で接続したところ問題なくファイル転送ができました。

WireSharkで上記プログラム実行中FTPのパケットモニタリングしてみたところ、
RES 220 FTP
REQ AUTH TLS
RES 234 AUTH TLS successful
REQ \200e\001\003 …
RES \026\003\001 …
RES \275\036C\207K …
REQ \025\003\001 …
RES 550 TLS handshake failed

という結果になりました。

【質問】
☆の位置でハンドシェイクに失敗していまいます。
FTPSでファイル転送をする場合
・コマンド送信の順番
・SSLSocketの作成手順
に間違いがあるのかもしれませんが、わからなくて困っています。

また、ハンドシェイクに成功したあとは「PBSZ 0」「PROT P」というコマンドを送信し、
FTPSではない、FTPでのファイル転送と同じ手順で、ファイル転送ができるのでしょうか?

具体的なコードを交えて教えていただけると大変助かります。
よろしくお願い致します。m(_ _)m

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。