gitlab添加ssh-keys之后克隆依然需要输入密码

时间:2022-07-22
本文章向大家介绍gitlab添加ssh-keys之后克隆依然需要输入密码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

问题描述

从电脑上拉取gitlab仓库的代码时,将本机的id_rsa.pub密钥传到gitlab上之后,使用git clone克隆代码后依然要求输入密码,本来非常简单的一个过程,但却暴漏了很多的问题,下面讲诉下解决的方法

gitlab不使用内置nginx

由于我的gitlab机器上有一个harbor服务,已经占用了80端口,所以,我考虑使用另一台nginx来反向代理gitlab机器,所以需要修改gitlab的配置文件 禁用nginx

vim /etc/gitlab/gitlab.rb
将
nginx['enable'] = true
修改为
nginx['enable'] = false

允许gitlab-workhorse监听TCP

vim /etc/gitlab/gitlab.rb
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "192.168.1.122:8181"

重载配置并重启

gitlab-ctl reconfigure
gitlab-ctl restart

配置nginx反向代理

我们在另一台装有nginx的机器配置反向代理,来代理gitlab

cat conf.d/git.conf 
upstream git-server {
        server 192.168.1.122:8181;
}

server {
        listen 80;
        server_name     git.xxxxxx.com;

        location / {
        proxy_http_version 1.1;
        proxy_redirect          off;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;  #获取真实ip
        proxy_set_header       X-Forwarded-For   $proxy_add_x_forwarded_for; #获取代理者的真实ip
        client_max_body_size    10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   300s;
        proxy_send_timeout      300s;
        proxy_read_timeout      300s;
        proxy_buffer_size       128k;
        proxy_buffers           2 256k;
        proxy_headers_hash_max_size 512;
        proxy_headers_hash_bucket_size 64;
        proxy_busy_buffers_size 256k;
        proxy_temp_file_write_size 256k;
        proxy_pass http://git-server;
        }
}

完成以上配置,我以为这样就算完成了,但是在执行git clone克隆项目的时候依然需要输入密码,各种谷歌,依然没有找到问题的所在,直到看到一篇博客,就像看到了一颗救命稻草,感谢: https://blog.hobairiku.site/2018/02/26/gitlab-setup/#%E9%85%8D%E7%BD%AEgitlab%E7%9A%84%E5%85%A5%E5%8F%A3

ok,接下来就是按照上面博客中提示的,修改gitlab的ssh端口

修改gitlab的SSH端口

只需修改这一段就可

vim /etc/gitlab/gitlab.rb
gitlab_rails['gitlab_shell_ssh_port'] = 24

然后再次重载和重启,最后就是非常关键的一步了,就是把ssh给代理出去,当然是通过nginx的方式,看到这,对于年幼的我,属实夸张了一把!!

nginx反代SSH

在我们的nginx服务器上,肯定也是跑着ssh服务,同样端口默认也是22,所以当我们通过外部nginx访问时,nginx会帮我们转发到gitlab所在服务器的ssh端口,配置如下:

# cat nginx.conf 

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
# 增加此配置
stream {
upstream ssh {
        hash $remote_addr consistent;
        server  192.168.1.122:22 max_fails=3 fail_timeout=10s;  
    }    
    server {
        listen 24;
        proxy_connect_timeout 20s;
        proxy_timeout 5m;
        proxy_pass ssh;
    }
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';


    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

ssh是使用在tcp协议上的,而不是http,所以反向代理也要单独配置,使用Nginx的stream功能实现tcp代理。编辑stream模块,完事后,重启下nginx即可,然后再次git clone就可以解决了。