我正在尝试使用此cli命令openssl s_client -connect www.yahoo.no:443 2> /dev/null | openssl x509 -noout -enddate | cut -d = -f 2
读取远程网站ssl cert。
这在cli中工作正常,但是当我在golang中执行它时:
package main
import (
"bytes"
"log"
"os/exec"
"time"
)
func main() {
cmd := exec.Command("echo", "| openssl s_client -connect www.yahoo.com:443 2> /dev/null | openssl x509 -noout -enddate | cut -d = -f 2")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
log.Println(out.String())
}
我一无所获。如何在go中运行此命令?
更新:
这是我尝试过的但没有成功
func command() {
cmd1 := exec.Command("openssl", "s_client", "-connect", "www.yahoo.no:443", "2>", "/dev/null")
cmd2 := exec.Command("openssl", "x509", "-noout", "-enddate")
var out bytes.Buffer
reader, writer := io.Pipe()
cmd1.Stdout = writer
cmd2.Stdin = reader
cmd2.Stdout = &out
cmd1.Start()
cmd2.Start()
cmd1.Wait()
writer.Close()
cmd2.Wait()
reader.Close()
io.Copy(&out, reader)
log.Println(out.String())
}
我得到空响应。
最佳答案
Go的标准库包含功能完善的TLS实现,因此实际上没有理由启动两个庞大的openssl进程:
package main
import (
"crypto/tls"
"fmt"
"log"
"net"
"time"
)
func main() {
conn, err := net.Dial("tcp", "example.com:443")
if err != nil {
log.Fatal(err)
}
client := tls.Client(conn, &tls.Config{
ServerName: "example.com",
})
defer client.Close()
if err := client.Handshake(); err != nil {
log.Fatal(err)
}
cert := client.ConnectionState().PeerCertificates[0]
fmt.Println(cert.NotAfter.Format(time.RFC3339)) // Output: 2020-12-02T12:00:00Z
}
关于go - 在golang中执行echo和openssl命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53807888/