首页 > 其他分享 >go 同一个https端口实现多种认证方式

go 同一个https端口实现多种认证方式

时间:2024-02-26 09:12:02浏览次数:26  
标签:127.0 0.1 端口 https go curl k8s 1000

参考kube-apiserver,访问https端口时,-k允许跳过默认的证书认证,从而实现多种认证方式。

package main

import (
	"crypto/tls"
	"fmt"
	"net/http"

	klog "k8s.io/klog/v2"
)

func healthCheck(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "ok")
}

func authCheck(w http.ResponseWriter, r *http.Request) {
	token := r.Header.Get("Authorization")
	if token == "" {
		fmt.Fprintf(w, "fail")
		return
	}

	if token == "abc" {
		fmt.Fprintf(w, "ok")
	} else {
		fmt.Fprintf(w, "fail")
	}
}

func main() {
	mux := http.NewServeMux()
	mux.HandleFunc("/health", healthCheck)
	mux.HandleFunc("/auth", authCheck)

	srv := &http.Server{
		Addr:    "127.0.0.1:1000",
		Handler: mux,
		TLSConfig: &tls.Config{
			// 向客户端请求提供证书,非必须且不校验
			ClientAuth: tls.RequestClientCert,
		},
	}

	if err := srv.ListenAndServeTLS("/etc/kubernetes/pki/apiserver.crt", "/etc/kubernetes/pki/apiserver.key"); err != nil {
		klog.Fatalf("failed to listen server, err is %v", err)
	}
}
[root@node1 use-k8s-queue]# curl http://127.0.0.1:1000
Client sent an HTTP request to an HTTPS server.
[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000
curl: (60) Peer's Certificate issuer is not recognized.
[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000/auth
curl: (60) Peer's Certificate issuer is not recognized.
[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000/health
curl: (60) Peer's Certificate issuer is not recognized.
[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000/health -k
ok[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000/auth -k -H 'Authorization:abc'
ok

如果TLSConfig中ClientAuth设置成RequireAndVerifyClientCert,那么访问https时必须通过证书认证,不允许跳过,加-k也不行。

[root@node1 use-k8s-queue]# curl https://127.0.0.1:1000/auth -k -H 'Authorization:abc'
curl: (58) NSS: client certificate not found (nickname not specified)

 

标签:127.0,0.1,端口,https,go,curl,k8s,1000
From: https://www.cnblogs.com/WJQ2017/p/18033614

相关文章

  • https原理分析
    https说明对称加密秘钥只有1个客户端和服务端都保存一个同样的秘钥非对称加密秘钥有2个1个是公钥1个是私钥公钥是由私钥生成出来的公私钥是一对公钥可以公开给客户端服务端保存私钥不能公开公钥加密后的密文只能用私钥解密私钥加密后的密......
  • golang文件和目录操作
    读取文件通过Read方法读取import( "fmt" "os")funcmain(){ /* 打开文件 */ //以只读的方式打开文件,返回一个文件指针类型的对象和error file,err:=os.Open("./test.txt") //文件打开操作完之后必须关闭文件流,可以使用defer延迟关闭 deferfile.Close()......
  • Go 100 mistakes - #71: Misusing sync.WaitGroup
       ......
  • goland的git集成不能更新项目
    goland不能拉取,报错;remote:HTTPBasic:Accessdenied.Theprovidedpasswordortokenisincorrectoryouraccounthas2FAenabledandyoumustuseapersonalaccesstokeninsteadofapassword.Seehttp://127.0.0.1:8083/help/topics/git/troubleshooting_git#......
  • Go - #70: Using mutexes inaccurately with slices and maps
      ......
  • Go 100 mistakes - #69: Creating data races with append
        ......
  • golang反射
    反射有时我们需要写一个函数,这个函数有能力统一处理各种值类型,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在,这个时候我们就可以用到反射反射是指在程序运行期间对程序本身进行访问和修改的能力。正常情况程序在编译时,变量被转换......
  • Go - context keys and values
    ISTHEREAWAYTOLISTKEYSINCONTEXT.CONTEXT?Nothereisnowaytolistallthekeysof context.Context.Becausethattypeisjustaninterface.Sowhatdoesthismean?Ingeneralavariablescanholdaconcretetypeoraninterface.Avariablewithan......
  • 全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自
    TableGo_20240224v8.4.0正式版发布,此次版本累计更新如下: 1、TableGo专属LOGO上线 2、生成数据库文档ER图新增备注+字段名的生成配置 3、生成自定义文件功能新增临时参数配置,用于使用临时数据生成自定义文件 4、新增基于Excel数据生成自定义文件,可导入Excel数据生成程序代码......
  • Go语言精进之路读书笔记第36条——使用atomic包实现伸缩性更好的并发读取
    atomic包提供了两大类原子操作接口:一类是针对整型变量的,包括有符号整型、无符号整型以及对应的指针类型;另一个类是针对自定义类型的。atomic包十分适合一些对性能十分敏感、并发量较大且读多写少的场合。如果要对一个复杂的临界区数据进行同步,那么首选依旧是sync包中的原语。36.......