2021年1月17日日曜日

go getでGitHub Enterprise Server上のパッケージを取得したら"connection refused"になる

原因を完全に把握できていないので、タイトルは不正確かもしれません。

イントラネットに構築した(つまり外部からアクセスできない)GitHub Enterprise Server上のGolangパッケージを取得しようとしたら"connection refused"メッセージが出ました。

エラーメッセージ

仮にリポジトリーのURLを"https://ghe.example.com/user/repository"、パッケージバージョンをv0.1.0とするとこんな感じ。

$ go get ghe.example.com/user/repository
go: downloading ghe.example.com/user/repository v0.1.0
go get ghe.example.com/user/repository: ghe.example.com/user/repository@v0.1.0: verifying module: ghe.example.com/user/repository@v0.1.0: reading https://sum.golang.org/lookup/ghe.example.com/user/repository@v0.1.0: 410 Gone
	server response: not found: ghe.example.com/user/repository@v0.1.0: unrecognized import path "ghe.example.com/user/repository": https fetch: Get "ghe.example.com/user/repository?go-get=1": dial tcp 192.168.0.1:443: connect: connection refused
$ 

ちなみにこのURLはHTTPS化もされています。オレオレ証明書でもないはず。

原因

最初に書いた通り、よくわかっていません。HTTPSまわりがクサいんですが、確定はできていません。

外部(github.comとか)にあるパッケージは普通にgo getできていますし、curl https://ghe.example.comを実行しても普通にレスポンスを取得できます。

姑息な対処

根本解決ではないんですが、-insecureオプションをつけると取得できることは確認済みです。

$ go get -insecure ghe.example.com/user/repository
go: downloading ghe.example.com/user/repository v0.1.0
go: ghe.example.com.com/user/repository upgrade => v0.1.0
$ 

このオプションをつけると取得できるということでやっぱりHTTPS周りがクサいです。

まあイントラネット上に構築してるからそこまで危険でもないだろうということでこの方法で運用しているんですが、なんかキモいのでいつか根本解決したい。

2 件のコメント:

  1. Go Modules Reference に解決策っぽいものを見つけたので共有させていただきます。
    https://golang.org/ref/mod#private-modules

    前提:
    go version = 1.16.3
    `GOPRIVATE`という変数にURLを指定してやれば良いようです。

    例:
    go env -w GOPRIVATE=ghe.example.com

    僕の利用しているGHE では-insecureを使わなくても問題なく go get できました。
    また、-insecure フラグは将来的に削除予定だそうです(go help get で確認できました)。

    返信削除
  2. すみませんコメントに気づいていませんでした!
    ちょうど先日Go1.17にアップデートしたところ、本記事の内容が使えなくなっていたのでGOPRIVATEが役に立ちました。ありがとうございます!

    > 僕の利用しているGHE では-insecureを使わなくても問題なく go get できました。
    こちらの環境で使えない理由はまだわかっていないんですが、Let's Encryptの証明書を使っているのでそれが関係しているのかもですね・・・

    返信削除