Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenSSH claims private keys are illegal because LF after the last line of them are removed #147

Closed
tats-u opened this issue Jul 21, 2020 · 8 comments · Fixed by #171
Closed

Comments

@tats-u
Copy link
Contributor

tats-u commented Jul 21, 2020

      - name: Install SSH Key (target)
        uses: shimataro/[email protected]
        with:
          # SSH private key
          key: |+
            ${{ secrets.DEPLOY_SSH_KEY }}
          name: id_target
          known_hosts: ${{ secrets.DEPLOY_HOST_KEY }}
          # SSH config
          config: |
            Host target
            HostName ${{ secrets.DEPLOY_HOST }}
            User ${{ secrets.DEPLOY_HOST_USER }}
            Port ${{ secrets.DEPLOY_HOST_PORT }}
            IdentityFile ~/.ssh/id_target
            ProxyJump jumphost
      - name: Complete EOL in EOF of SSH keys
        run: |
          for key in ~/.ssh/id_target; do
            chmod +w $key
            [[ `tail -c 1 $key` != `echo` ]] && echo >> $key
            chmod -w $key
          done
        shell: bash

I couldn't install an OpenSSH private key only with the 1st step.
I managed to do it by adding the 2nd step.
It makes up for the lost LF in the last line. (----- -> -----\n)
tail -c 1 $key outputs - if the last LF is missing, or \n (equals to the output of echo) if alive.

@tats-u tats-u changed the title OpenSSH claims private OpenSSH private keys are illegal because LF in the last line of them are removed OpenSSH claims private keys are illegal because LF after the last line of them are removed Jul 21, 2020
@shimataro
Copy link
Owner

(日本語で書きます!)
こちらで試した限りでは末尾にLFをつけなくても動いているんですが、何が違うんでしょうね・・・? 🤔

動かしているOS( runs-on )とSSH鍵の形式を教えていただけますか?

@tats-u
Copy link
Contributor Author

tats-u commented Jul 23, 2020

OS: ubuntu-latest
SSH鍵生成コマンド (Command to generate the SSH keys): ssh-keygen -t ed25519 -C deploy_hoge_GitHub -f ./id_25519_hoge -N ""

ちなみに実機のUbuntu 18.04でも再現しました。
Also, I found it can be reproduced in Ubuntu 18.04 in my physical machine.

エラーメッセージは

Load key "<PRIVATE KEY FILE PATH>": invalid format

です。
Here is the format of the error messages:

LFを消すには次のコマンドを実行しました。
I ran the following command to remove the LF:

perl -pe "chomp if eof" id_original > id_invalid_exported

Ubuntu 18.04でssh -Vを実行した結果は以下の通りになりました。
I got the following output by running ssh -V in Ubuntu 18.04:

OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017

@shimataro
Copy link
Owner

@tats-u
すみません、返事が遅れました!

Load key "<PRIVATE KEY FILE PATH>": invalid format

SSHキーのフォーマットが原因かもしれません。
以下を参考にしてみてください!
https://github.com/shimataro/ssh-key-action#qa

@tats-u
Copy link
Contributor Author

tats-u commented Aug 25, 2020

@shimataro
返事が大変遅れて申し訳ありません。PEM形式について調査してみました。

  • PEM形式はED25519に非対応 (ECDSA・RSAのみ)
    • ED25519の秘密鍵をssh-keygen -p -m PEM -f [id_ed25519...]しても---BEGIN OPENSSH PRIVATE KEYから始まることに変わりがない
  • PEM形式は最後のLFを取り除いても使用可能(ECDSAで確認)
  • ED25519の秘密鍵をssh-keygen -p -m PEM -f [id_ed25519...]で変換したものは、末尾のLFを取り除くと、OpenSSHにinvalid formatと怒られる
    • 取り除かないものはOpenSSHで使用可能
    • ただしPEMとしては正しくないようで、GPG4WIN付属のKleopatraに渡すと「復号に失敗しました」「NO CMS object」と怒られる
    • ECDSAのものはopenssl ec -in [id_ecdsa.pem] -nooutなどに渡すと正しく情報が表示される

@shimataro
Copy link
Owner

@tats-u
調査ありがとうございます!そしてこちらも返事が遅れてしまい申し訳ありません。

もともとOpenSSH形式の鍵を使えないのはVMのOpenSSHのバージョンの問題なので、VM側の更新を待つか、(RSAなどを使った)PEM形式の鍵を使うかのどちらかをおすすめします・・・!

@tats-u
Copy link
Contributor Author

tats-u commented Sep 6, 2020

@shimataro
OpenSSH形式は2014年頃から対応しているそうなので、やはり OpenSSH形式 + GitHub側の問題で末尾の改行が削られる の組み合わせにより初めて本問題を引き起されると推察されます。

@MatthiasKunnen
Copy link

I use the following as a workaround:

      -
        name: Install SSH Key
        uses: shimataro/[email protected]
        with:
          key: ${{ secrets.DEPLOYMENT_SSH_KEY }}
          name: id_ed25519
          known_hosts: ${{ env.known_hosts }}
      -
        name: Fix no newline at end of SSH key # Workaround until https://github.com/shimataro/ssh-key-action/pull/156
        run: |
          echo "" | sudo tee -a ~/.ssh/id_ed25519

@tats-u
Copy link
Contributor Author

tats-u commented Feb 18, 2021

@MatthiasKunnen
I have prepared a makeshift like you.

        run: |
          for key in ~/.ssh/id_ed25519; do
            chmod +w $key
            [[ `tail -c 1 $key` != `echo` ]] && echo >> $key
            chmod -w $key
          done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants