記事
· 2023年11月10日 4m read

%Net.SSH.Session()で公開鍵と秘密鍵を使用してSFTP接続する方法

SFTPサーバ側で公開鍵と秘密鍵を作成し、それをIRISサーバにコピーして、%Net.SSH.Session() の AuthenticateWithKeyPair() を使用してSFTP接続する一連の手順(サンプル)をご紹介します。


【環境】

SFTPサーバ:CentOS8
SFTPクライアント:Windows10 & IRIS2023.1.2
SFTP接続用ユーザ:mysftpuser


【手順】

(1) CentOSでSSHの公開鍵と秘密鍵を作成します (今回は、RSA方式、4096bit)

ssh mysftpuser@172.18.xx.xx でログインし、以下 mysftpuser として作業します。

$ ssh mysftpuser@172.18.xx.xx
password:<pass>

$ ssh-keygen -t rsa -b 4096      # ssh-keygenコマンドは、SSHで利用する認証用の鍵を生成・管理・変換するコマンドです
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mysftpuser/.ssh/id_rsa): <Enter>
Enter passphrase (empty for no passphrase): <pass2>      # キーファイルのパスワード。(5)、(6)でSFTP接続するときに使います

# デフォルトで以下に作成されます
#  秘密鍵: /home/mysftpuser/.ssh/id_rsa
#  公開鍵: /home/mysftpuser/.ssh/id_rsa.pub


(2) CentOSで鍵を準備します

作成した公開鍵 id_rsa.pub を authorized_keys に名前を変更し、各権限を変更します。

$ cd /home/mysftpuser/.ssh
$ mv id_rsa.pub authorized_keys
$ chmod 600 authorized_keys
$ chmod 700 /home/mysftpuser/.ssh


(3) CentOS側の公開鍵・秘密鍵をともにSFTPクライアント(Windows)にコピーしておきます

公開鍵 scp mysftpuser@172.18.xx.xx:/home/mysftpuser/.ssh/authorized_keys C:\temp\authorized_keys
秘密鍵 scp mysftpuser@172.18.xx.xx:/home/mysftpuser/.ssh/id_rsa C:\temp\id_rsa
 

(4) CentOSで鍵認証以外のアクセスを拒否するように設定します

SSHのセキュリティ設定(sshd_config) を変更します。

$ vi /etc/ssh/sshd_config にて以下のようにそれぞれ変更します。
  PubkeyAuthentication yes       <-- 鍵認証有効
  PasswordAuthentication no      <-- パスワード接続不許可

# sshdを再起動後、上記が有効になります。
$ systemctl stop sshd.service
$ systemctl start sshd.service


(5) SFTPクライアント側設定を確認します

Windowsクライアントから鍵のないSFTP接続は拒否されることを確認します。

C:\temp>sftp mysftpuser@172.18.xx.xx
mysftpuser@172.18.xx.xx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
Connection closed

手順(3) でコピーした秘密鍵 id_rsa を以下フォルダにコピーします。  ※<username> はWindowsログインユーザ
   C:\Users\<username>\.ssh

すると、SFTPコマンドは上記のid_rsaを使うため、接続は成功します。
C:\temp>sftp mysftpuser@172.18.xx.xx
Enter passphrase for key 'C:\Users\<username>\.ssh\id_rsa': <pass2>
Connected to 172.18.xx.xx.
sftp>
 

(6) IRISコマンドでの実行がうまくいくか確認します

set ssh=##class(%Net.SSH.Session).%New()
write ssh.Connect("172.18.xx.xx",22)

;; 第1引数 SFTPユーザ名
;; 第2引数 公開鍵 (手順3 でコピーしたもの)
;; 第3引数 秘密鍵 (手順5 のSFTPコマンドで動いたもの)
;; 第4引数 パスフレーズ (秘密鍵用に指定したもの:<pass2>)
write ssh.AuthenticateWithKeyPair("mysftpuser","c:\temp\authorized_keys","C:\Users\<username>\.ssh\id_rsa","<pass2>")

write ssh.OpenSFTP(.sftp)
write sftp.Get("/home/mysftpuser/a.txt","C:\temp\a.txt")    ;; サーバの a.txt を C:\temp にコピー


ファイル名に日本語を含むとエラーになったり、ファイルの中身が文字化けしてしまう場合、SFTPサーバとクライアントの文字コードが異なることが原因となっている可能性があります。
その場合は、%Net.SSH.Session() クラスのプロパティを使用して文字コードを指定します。

kill
set ssh=##class(%Net.SSH.Session).%New()
set ssh.RemoteCharset="UTF8"     // SFTPサーバ環境の文字コード(今回のサンプルでは CentOS8)
set ssh.LocalCharset="SJIS"      // クライアント環境の文字コード(今回のサンプルでは Windows)
write ssh.Connect("172.18.xx.xx",22)
write ssh.AuthenticateWithKeyPair("mysftpuser","c:\temp\authorized_keys","C:\Users\<username>\.ssh\id_rsa","<pass2>")
write ssh.OpenSFTP(.sftp)
write sftp.Get("あいうえお.txt","C:\temp\あいうえお.txt")


enlightened【ご参考】
SSH 接続する %Net.SSH.Session の使用とデバッグ方法

ディスカッション (0)0
続けるにはログインするか新規登録を行ってください