web-dev-qa-db-ja.com

sshホストキー証明書、有効期間をリモートで検索しますか?

Ssh証明書を使用してsshホストキーを認証する環境があります。 ssh-keygen -s /path/to/ca -h ...を実行して作成される証明書の種類について話しています。これらの証明書も有効期間を指定して作成され、有効期限がいつになるかが示されます。これらの証明書は、十分に長く使用されており、有効期限が近づき始めたらすぐに確認できるように、監視を開始する必要があります。

いずれにせよ、ログインせずにリモート接続を行うことができ、どういうわけか有効期間がaltで表示されます。証明書をダウンロードしますか? ssh -vvvを実行しても、必要な情報が表示されません。 ssh-keyscanも証明書を認識しているようには見えません。おそらく、私が十分に詳しく調べていないライブラリがいくつかありますか?

最悪の場合、ローカルで実行され、ssh-keygen -L -fの出力を解析する監視プラグインをいつでも作成できます。それでも、リモートスキャンは本当に好ましいアプローチのように感じます。

7
andol

これは可能ですが、ツールのサポートが不足しています。 SSHプロトコルを十分に話すライブラリを見つけたので、完全なsshログインなしでホスト証明書valid_beforetimeを抽出するツールを作成できました。これがGo言語です。お役に立てば幸いです。

package main

import "golang.org/x/crypto/ssh"
import "fmt"
import "os"
import "time"

func ignoreCertChain(auth ssh.PublicKey, address string) bool {
    return true // Pretend all certificates are trusted.
}

var sawACert bool

func examineCert(cert *ssh.Certificate) bool {
  expires := cert.ValidBefore
  var humanReadable string
  if expires >= ssh.CertTimeInfinity {
    humanReadable = "infinity"
  } else if expires < (1 << 63) {
    humanReadable = time.Unix(int64(expires), 0).Format(time.RFC3339)
  } else {
    humanReadable = "the distant future"
  }
  fmt.Println("Cert expires at time", expires, "(" + humanReadable + ")")
  sawACert = true
  return true  // Reject the cert, to force early connection close.
}

func main() {
  serverHostPort := os.Args[1]
  checker := &ssh.CertChecker{
    IsHostAuthority: ignoreCertChain,
    IsRevoked: examineCert,
  }
  config := &ssh.ClientConfig{
    User: "test-sshcertscan-not-a-real-login-attempt",
    Auth: []ssh.AuthMethod{
      ssh.Password(""),
    },
    HostKeyCallback: checker.CheckHostKey,
  }
  sawACert = false
  client, err := ssh.Dial("tcp", serverHostPort, config);
  if err != nil && !sawACert {
    panic(fmt.Sprint("Cannot connect to ", serverHostPort, ", error: ",
                     err.Error()))
  } else if client != nil {
    defer client.Close()
  }
}

(簡単な使用方法:インストール Go 、上記のコードをsshcertscan.goに保存し、go build sshcertscan.goを実行してから、examplehostポート22のsshサーバーを./sshcertscan examplehost:22でポイントします。 )

6
aecolley

残念ながら、私はオープンソースツールを知りません。 nmapは [〜#〜] nse [〜#〜] スクリプトでなんとかしてそれを取得できるようです(ただし、微調整が必​​要です-/ usr/share/nmap/scriptsを確認してください)。

SSHの Tectia SSH サーバーには、証明書を取得するssh-fetchkeyと呼ばれるツールが含まれており、ssh-certviewを使用して詳細を表示できます。

1

答えは「それは不可能」だと思います。少なくとも私が見つけた方法ではありませんが、opensshクライアントまたはpython用のparamiko SSHライブラリを使用しています。 SSHDで使用されているキーが証明書の有効期間を確認したばかりのキーであることを確認する、より簡単なリモートチェックと組み合わせた、ローカルチェックをお勧めします。

0