Skip to content

Commit

Permalink
support for RemoteAccessVpnGateway v2.0.0.
Browse files Browse the repository at this point in the history
  • Loading branch information
hasunuma committed Apr 13, 2023
1 parent ee37e43 commit 376e341
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 44 deletions.
41 changes: 26 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
## プライベートCA 作成ツール genca

ニフクラ [リモートアクセスVPNゲートウェイ](https://pfs.nifcloud.com/service/ra_vpngw.htm)のクライアント証明書認証で利用出来る、プライベートCA作成ツールです。
[プライベートCAを1clickで作成出来るツール genca を公開しました!](https://blog.pfs.nifcloud.com/20190410_genca)
ニフクラ [リモートアクセスVPNゲートウェイ](https://pfs.nifcloud.com/service/ra_vpngw.htm)で利用できるサーバー証明書、CA証明書作成ツールです。

## 注意事項

* 本ツールはニフクラのサポート対象外となります。ご利用は自己責任でお願いいたします。
ツールに関するお問い合わせは[ベーシックサポート(トラブル窓口)](https://pfs.nifcloud.com/inquiry/support.htm)のサポート範囲外となります。
ツールに関するお問い合わせはgithub上のissueを起票してください。
コミュニティベースでのサポートとなります。

## 利用方法

### ツールの実行

ご利用のOS環境にあったバイナリをダウンロードし、gencaを実行して下さい。
実行すると、プライベートCAと署名済みクライアント証明書が自動生成されます
実行すると、プライベートCAと署名済みクライアント証明書、サーバー証明書が自動生成されます

* nifcloud.local.CAcert.pem
* プライベートCA証明書です。
Expand All @@ -28,24 +29,37 @@
* client.nifcloud.local.signed.crt.pem
* 署名済みクライアント証明書
* プライベートCAによって電子署名されたクライアント証明書です。
* client.nifcloud.local.pfx
* クライアント証明書(PKCS #12形式)
* クライアント証明書認証を利用する際に必要なファイルです。Windowsなどのクライアント端末に予めインポートする必要があります。
* server.nifcloud.local.crt.pem
* サーバー証明書(署名前)
* server.nifcloud.local.csr.pem
* サーバー証明書署名要求
* server.nifcloud.local.pem
* サーバー証明書の秘密鍵
* server.nifcloud.local.signed.crt.pem
* 署名済みサーバー証明書
* プライベートCAによって電子署名されたサーバー証明書です。

### サーバー証明書

生成されたサーバー証明書(server.nifcloud.local.signed.crt.pem)と、サーバー証明書の秘密鍵(server.nifcloud.local.pem)をコントロールパネルからアップロードし、
サーバー証明書の一覧に表示される事を確認します。
[クラウドヘルプ(サーバー証明書:アップロード)](https://pfs.nifcloud.com/help/ssl/upload.htm)

このサーバー証明書をリモートアクセスVPNゲートウェイの作成時や設定変更で指定します。
接続するには、クライアント設定ファイルにプライベートCA証明書(nifcloud.local.CAcert.pem)を指定する必要があります。
詳細は以下ご参照ください。
* [クラウド技術仕様(リモートアクセスVPNゲートウェイ:クライアント設定ファイル)](https://pfs.nifcloud.com/spec/ra_vpngw/client_config.htm)
* [クラウドユーザーガイド(リモートアクセスVPNゲートウェイ:Windows 11のリモートアクセスVPNゲートウェイ(v2.0.0)利用方法)](https://pfs.nifcloud.com/guide/cp/ra_vpngw/ravgwv2_setup_win11.htm)

### CA証明書のアップロード

生成されたCA証明書(nifcloud.local.CAcert.pem)をコントロールパネルからアップロードし、CA証明書の一覧に表示される事を確認します。
[クラウドヘルプ(CA証明書:アップロード)](https://pfs.nifcloud.com/help/ca/upload.htm)

### クライアント証明書(PKCS #12形式)のインポート

クライアント証明書認証を利用するには、クライアント証明書(client.nifcloud.local.pfx)を端末にインポートする必要があります。
インポート時にパスワードが求められますが、本ツールで作成したクライアント証明書にはパスワード設定がされていないため、未入力でインポートしてください。

## ソースコードのビルド

go get github.com/hashicorp/packer

go build genca.go
# または
gox
Expand All @@ -57,8 +71,5 @@

[LICENSE](./LICENSE)をご参照下さい。

## pkcs12配下のソースコードについて

クライアント証明書をPKCS #12形式に変換する際に、 [packer の pkcs12](https://github.com/hashicorp/packer/tree/master/builder/azure/pkcs12)を利用しています。


47 changes: 18 additions & 29 deletions genca.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"encoding/pem"
"errors"
"fmt"
"github.com/hashicorp/packer/builder/azure/pkcs12"
"io/ioutil"
"log"
"math/big"
Expand Down Expand Up @@ -86,8 +85,11 @@ func genkey(key_name string) {

now := time.Now()
var years = 4
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)

cert_template := x509.Certificate{
SerialNumber: new(big.Int).SetInt64(0),
SerialNumber: serialNumber,
Subject: pkix.Name{
CommonName: key_name,
Organization: []string{key_name},
Expand Down Expand Up @@ -235,10 +237,12 @@ func self_signed(crt_name string, ca_key_name string, ca_cert_name string, clien

now := time.Now()
var years = 4
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)

ComName := "client.nifcloud.local"
ComName := crt_name
template := x509.Certificate{
SerialNumber: new(big.Int).SetInt64(0),
SerialNumber: serialNumber,
Subject: pkix.Name{
CommonName: ComName,
Organization: []string{"nifcloud.local"},
Expand All @@ -250,6 +254,7 @@ func self_signed(crt_name string, ca_key_name string, ca_cert_name string, clien
IsCA: false,
SubjectKeyId: GenerateSKI(csr_pub),
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},
}
crt_Bytes, err := x509.CreateCertificate(
rand.Reader, &template, ca_cert, csr_pub, ca_key)
Expand All @@ -269,28 +274,6 @@ func self_signed(crt_name string, ca_key_name string, ca_cert_name string, clien

}

func conv_pkcs12(cert_name string, priv_key_name string, pfx_name string) {
priv, err := readPrivateKey(priv_key_name)
if err != nil {
fmt.Println(err)
}

cert, err := readCertificateByte(cert_name)
pfxbyte, err := pkcs12.Encode(cert.Bytes, priv, "")
if err != nil {
err = fmt.Errorf("Failed to encode certificate as PFX: %s", err)
return
}

pfxOut, err := os.Create(pfx_name)
if err != nil {
log.Print("Failed to open "+pfx_name, err)
return
}
pfxOut.Write(pfxbyte)
pfxOut.Close()
log.Print("Written " + pfx_name + "\n")
}

func genCACert(caName string, years int) {
priv, err := rsa.GenerateKey(rand.Reader, 2048)
Expand All @@ -300,9 +283,11 @@ func genCACert(caName string, years int) {
}

now := time.Now()
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)

template := x509.Certificate{
SerialNumber: new(big.Int).SetInt64(0),
SerialNumber: serialNumber,
Subject: pkix.Name{
CommonName: caName,
Organization: []string{caName},
Expand Down Expand Up @@ -374,6 +359,10 @@ func main() {
// Self Sign.
self_signed(name, domain+".CAkey.pem", domain+".CAcert.pem", name+".csr.pem")

// Convert PKCS12 (.pfx)
conv_pkcs12("client."+domain+".signed.crt.pem", "client."+domain+".pem", "client."+domain+".pfx")
name = "server." + domain

//Create Server Cert Private key
genkey(name)
// Self Sign.
self_signed(name, domain+".CAkey.pem", domain+".CAcert.pem", name+".csr.pem")
}
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module github.com/nifcloud/genca

go 1.18

0 comments on commit 376e341

Please sign in to comment.