前言
現在要求用Key pair的SSH越來越多,不管是Git, Ansible或是Oracle Cloud的VM都會要求用Key pair來連線,所以就把相關的指令整理一下
SSH key Pair
參考資料
產生Key Pair
Linux/FreeBSD console
基本指令是使用ssh-keygen指令但是基於使用方便可以加上一些參數來調整
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile] [-m format] [-N new_passphrase] [-O option] [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa] [-w provider] [-Z cipher] ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase] [-P old_passphrase] [-Z cipher] ssh-keygen -i [-f input_keyfile] [-m key_format] ssh-keygen -e [-f input_keyfile] [-m key_format] ssh-keygen -y [-f input_keyfile] ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase] ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile] ssh-keygen -B [-f input_keyfile] ssh-keygen -D pkcs11 ssh-keygen -F hostname [-lv] [-f known_hosts_file] ssh-keygen -H [-f known_hosts_file]sa ssh-keygen -K [-a rounds] [-w provider] ssh-keygen -R hostname [-f known_hosts_file] ssh-keygen -r hostname [-g] [-f input_keyfile] ssh-keygen -M generate [-O option] output_file ssh-keygen -M screen [-f input_file] [-O option] output_file ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider] [-n principals] [-O option] [-V validity_interval] [-z serial_number] file ... ssh-keygen -L [-f input_keyfile] ssh-keygen -A [-a rounds] [-f prefix_path] ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number] file ... ssh-keygen -Q [-l] -f krl_file file ... ssh-keygen -Y find-principals [-O option] -s signature_file -f allowed_signers_file ssh-keygen -Y check-novalidate [-O option] -n namespace -s signature_file ssh-keygen -Y sign -f key_file -n namespace file ... ssh-keygen -Y verify [-O option] -f allowed_signers_file -I signer_identity -n namespace -s signature_file [-r revocation_file]
-b 定義編碼長度, rsa預設是3072,其實很夠用了 -t 編碼方式, 有dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa可以挑,一般教學都是推薦用rsa -C 這個Comment可以定義對應的Email address -f 可以定義out put的key pair名稱
|
所以一般來說我都會這樣用
1
| ssh-keygen -b 4096 -t rsa -f <server_or_service_name>
|
然後就會在~/.ssh/裡面產生<server_or_service_name> & <server_or_service_name>.pub兩個檔案
Windows by Putty

基本上是一樣的在右下角設定好bits,確認是哪一種,然後按下Generate就會產生Private key跟Public Key
同場加映 - 在企鵝下的ppk->pem
因為時常會用Manjaro client,所以去查了一下, Manjaro安裝putty後就自動裝上puttygen了,所以不需要再安裝,使用Ubuntu/Debian的人還還需要裝上
1 2
| apt install putty-tools
|
有了工具就轉檔
1 2
| puttygen yourkey.ppk -O private-openssh -o yourkey.pem
|
轉好後就可以用以下指令登入
1 2
| ssh -i /your/key/file user@hostname.or.ip
|
Public Key @ Server side
這個有兩個方法可以做
Simple Copy & Paste
直接把public key的內容貼到被登入帳號的~/.ssh/authorized_keys
可以利用vi編輯的時候複製貼上或是
1
| cat <server_or_service_name>.pub >> ~/.ssh/authorized_keys
|
不過一般來說在做這件事的時候都會懶的先upload <server_or_service_name>.pub到目標server上,所以很少會這樣用
Putty Keygen轉換
因為Putty不吃一般的pem檔案,所以要轉換成ppk給putty從windows連線到sshd使用

讀進去後,可以加上自己的密碼

鍵入自己想要的密碼後Save as a ppk file就好了
ssh-copy-id
1
| ssh-copy-id -i ~/.ssh/<server_or_service_name>.pub USER@HOST
|
預設是~/.ssh/id_rsa.pub所以要用-i指令定義是哪個檔案
這樣就可以把public key弄上去,之後再去修改Server端的sshd_config把密碼登入關掉就好了
sshd_config
除了client端的設定以外,其實server端也有不少要調整的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| PermitRootLogin no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no PermitEmptyPasswords no
ChallengeResponseAuthentication no UsePAM no
Match <User1>, <User2>, ...
PasswordAuthentication yes
|
SSH
其實這個很簡單就是
就可以用了,但是有指定的key的話就要加參數
1
| ssh -i /location/private_key USER@HOST
|
因為是認Private key的,所以可以在常用的client主機上都放上一樣的private key來進行