Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GitLab Comment Reporter always reports a certificate error talking to GitLab #1239

Closed
jberkers42 opened this issue Feb 2, 2022 · 20 comments · Fixed by #1249
Closed

GitLab Comment Reporter always reports a certificate error talking to GitLab #1239

jberkers42 opened this issue Feb 2, 2022 · 20 comments · Fixed by #1249
Labels
bug Something isn't working

Comments

@jberkers42
Copy link

Describe the bug
Since version 5.7 the GitLab Comment Reporter always throws a certificate error as follows:

[Gitlab Comment Reporter] You may need to define a masked Gitlab CI/CD variable MEGALINTER_ACCESS_TOKEN containing a personal token with scope 'api'
HTTPSConnectionPool(host='gitlab.internal.domain', port=443): Max retries exceeded with url: /api/v4/projects/420 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))

We currently host our GitLab instance on an Azure VM, with a Kubernetes GitLab Runner in AKS with Spot Instances on GitLab 14.7. The SSL Certificate is signed by our internal CA, and the Kubernetes Runners get the certificate as part of the Runner configuration.

I have further ensured that the CA Certificate is in the list of trusted certificates on the runner using pre_script steps in our GitLab CI pipeline to:

  • Ensure a copy of the certificate is in /usr/local/share/ca-certificates/internal-ca.crt
  • Perform update-ca-certificate
  • Validate that the certificate is present in /etc/ssl/certs/ca-certificates.crt
  • Use curl -vvvL to check access to our GitLab instance
  • Use python to dump out it's list of certificate locations

We configured the required settings for GITLAB_COMMENT_REPORTER to be able to work, such as the Personal Access Token and the Server and API URL values as per documentation guidance.

To Reproduce
Steps to reproduce the behavior:

  1. Ensure a MegaLinter pipeline entry exists for the project
  2. Configure GITLAB_COMMENT_REPORTER access token
  3. Configure Server and API URLs
  4. Create a Merge Request
  5. Monitor the MegaLinter job status
  6. Scroll down to just after the summary results table in the output
  7. See error above

Expected behavior
Expect GitLab API/Server connection to succeed, perhaps encounter an Authentication error.

Screenshots
Variables configured:

Screen Shot 2022-02-02 at 16 19 41

Additional context
Prior to ensuring the CA Certificate was present using pre_script steps, the markdown-link-checker was also failing on references to our GitLab instance. These errors have since gone away, however, the GITLAB_COMMENT_REPORTER issues persist.

Let me know if you need additional information.

@jberkers42 jberkers42 added the bug Something isn't working label Feb 2, 2022
@nvuillam
Copy link
Member

nvuillam commented Feb 3, 2022

This looks similar to this issue: #1125 (comment)

Please could you adapt and try these lines in your .mega-linter.yml ?

PRE_COMMANDS:
  - command: apk add --no-cache ca-certificates
    cwd: root
  - command: curl -L -o /usr/local/share/ca-certificates/RootCA.crt http://path.to.cert
    cwd: root
  - command: curl -L -o /usr/local/share/ca-certificates/IssueCA.crt http://path.to.cert
    cwd: root
  - command: update-ca-certificates
    cwd: root

@jberkers42
Copy link
Author

I adapted and added the commands suggested. These essentially duplicate my pre_script in the GitLab pipeline. I get the following output from the pre_script:

$ echo "Adding custom CA CERT to image"
Adding custom CA CERT to image
$ apk add --no-cache ca-certificates
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 1683 MiB in 282 packages
$ echo $CUSTOM_CA_CERT | sed 's/ CERTIFICATE/#CERTIFICATE/g' | sed 's/ /\n/g' | sed 's/#/ /' >> /usr/local/share/ca-certificates/ipsec-ca.crt
$ cat /usr/local/share/ca-certificates/ipsec-ca.crt >> /etc/ssl/cert.pem
$ update-ca-certificates
WARNING: ca-certificates.crt does not contain exactly one certificate or CRL: skipping

Output from PRE_COMMANDS:

[Pre] run: [apk add --no-cache ca-certificates] in cwd [/builds/vendors/LogRhythm/logrhythm-scripts]
[Pre] [fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 1683 MiB in 282 packages
] fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
OK: 1683 MiB in 282 packages
[Pre] run: [curl -L -o /usr/local/share/ca-certificates/ipsecca.crt http://files.soc.ipsec.net.au/ipsec-ca.crt] in cwd [/builds/vendors/LogRhythm/logrhythm-scripts]
[Pre] [  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  13[50](https://gitlab.soc.ipsec.net.au/vendors/LogRhythm/logrhythm-scripts/-/jobs/6920#L50)  100  1350    0     0    222      0  0:00:06  0:00:06 --:--:--    65
]   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1350  100  1350    0     0    222      0  0:00:06  0:00:06 --:--:--    65
[Pre] run: [update-ca-certificates] in cwd [/builds/vendors/LogRhythm/logrhythm-scripts]
[Pre] [WARNING: ca-certificates.crt does not contain exactly one certificate or CRL: skipping
WARNING: Skipping duplicate certificate in file ca-cert-ipsecca.pem
] WARNING: ca-certificates.crt does not contain exactly one certificate or CRL: skipping
WARNING: Skipping duplicate certificate in file ca-cert-ipsecca.pem

I still get the error:

[Gitlab Comment Reporter] You may need to define a masked Gitlab CI/CD variable MEGALINTER_ACCESS_TOKEN containing a personal token with scope 'api'
(if already defined, your token is probably invalid)HTTPSConnectionPool(host='gitlab.soc.ipsec.net.au', port=443): Max retries exceeded with url: /api/v4/projects/214 (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))

I added a POST_COMMAND for curl to check access and validate certificate:

[Post] run: [curl -vvvL https://gitlab.domain.internal/] in cwd [/builds/vendors/LogRhythm/logrhythm-scripts]
[Post] [  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 172.16.2.5:443...
* Connected to gitlab.domain.internal (172.16.2.5) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [106 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [1620 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [300 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [37 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES[256](https://gitlab.domain.internal/group/sub-group/project/-/jobs/6921#L256)-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=AU; ST=Victoria; L=Notting Hill; O=IPSec Pty Ltd; OU=Delivery; CN=gitlab.domain.internal
*  start date: Nov 22 03:17:53 2021 GMT
*  expire date: Jul 24 01:42:49 2023 GMT
*  subjectAltName: host "gitlab.domain.internal" matched cert's "gitlab.domain.internal"
*  issuer: DC=internal; DC=domain; CN=Internal-CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]

curl seems happy.

Since the POST_COMMANDS run before the GITLAB_COMMENT_REPORTER, I also added an "after_script" to the CI Pipeline to check again. This gives the same results as before, working OK.

Running after script...
$ curl -vvvL https://gitlab.domain.internal/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 172.16.2.5:443...
* Connected to gitlab.soc.ipsec.net.au (172.16.2.5) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*  CAfile: /etc/ssl/certs/ca-certificates.crt
*  CApath: none
} [5 bytes data]
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
} [512 bytes data]
* TLSv1.3 (IN), TLS handshake, Server hello (2):
{ [106 bytes data]
* TLSv1.2 (IN), TLS handshake, Certificate (11):
{ [1620 bytes data]
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
{ [300 bytes data]
* TLSv1.2 (IN), TLS handshake, Server finished (14):
{ [4 bytes data]
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
} [37 bytes data]
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
} [1 bytes data]
* TLSv1.2 (OUT), TLS handshake, Finished (20):
} [16 bytes data]
* TLSv1.2 (IN), TLS handshake, Finished (20):
{ [16 bytes data]
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=AU; ST=Victoria; L=Notting Hill; O=IPSec Pty Ltd; OU=Delivery; CN=gitlab.domain.internal
*  start date: Nov 22 03:17:53 2021 GMT
*  expire date: Jul 24 01:42:49 2023 GMT
*  subjectAltName: host "gitlab.domain.internal" matched cert's "gitlab.domain.internal"
*  issuer: DC=internal; DC=domain; CN=Internal-CA
*  SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
} [5 bytes data]

It just seems Python is refusing to use this when GITLAB_COMMENT_REPORTER is running.

@jberkers42
Copy link
Author

I put in a few extra debug statements in my GitLab CI before_script.

$ python -c "import ssl; print(ssl.get_default_verify_paths())"
DefaultVerifyPaths(cafile='/etc/ssl/cert.pem', capath='/etc/ssl/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/etc/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/etc/ssl/certs')
$ python3 -c "import requests;r = requests.get('[https://gitlab.soc.ipsec.net.au'](https://gitlab.soc.ipsec.net.au%27/), verify='/etc/ssl/cert.pem');print(r)"
<Response [200]>

If I point directly at the /etc/ssl/cert.pem file, it is OK. Note that it is in the list of ssl.get_default_verify_paths() output.

If I remove the verify parameter from the request call, it throws the error again:

requests.exceptions.SSLError: HTTPSConnectionPool(host='gitlab.soc.ipsec.net.au', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))

Almost seems like a bug in python/urlllib3/ssl.

OpenSSL Version: OpenSSL 1.1.1l 24 Aug 2021

@jberkers42
Copy link
Author

Lastly, for now anyway, I also did some directory listings.

/etc/ssl/cert.pem is a Symbolic Link to /etc/ssl/certs/ca-certificates.crt

so I did a basic python request with /etc/ss/certs/ca-certificates.crt as the verify parameter:

$ python -c "import requests;r = requests.get('https://gitlab.domain.internal',verify='/etc/ssl/certs/ca-certificates.crt');print(r)"
<Response [200]>

That works too. Why is python not properly using these locations for verification with it's defaults pointing to the same location?

@nvuillam
Copy link
Member

nvuillam commented Feb 4, 2022

The library used to interact with gitlab is python-gitlab https://python-gitlab.readthedocs.io/en/stable/ , maybe it needs to be called with some additional parameters, i'll try to have a look (you can too, you seem very good at investigaing ^^ )

@nvuillam
Copy link
Member

nvuillam commented Feb 4, 2022

Screenshot_20220204-091441.png

There, ssl_verify, we have to find a way to send the path to your certificate :)

@jberkers42
Copy link
Author

The odd thing, though, is that regular python has issues unless we supply the verify parameter, and even though I have provided the path to a file it should already be using, as per the default_verify_paths, it only works when the path is supplied explicitly.

The testing I have done is using the following, default, paths:

  • /etc/ssl/cert.pem
  • /etc/ssl/certs/ca-certificates.crt

Both are in Python's default paths for ssl verification, and are updated by the method you provided. Providing either path to python-gitlab explicitly should work for anyone adding a custom certificate per this manner.

@nvuillam
Copy link
Member

nvuillam commented Feb 5, 2022

@jberkers42 I think I'm close to a generic solution that would avoid to use pre_commands

  • added ca-certificates to base docker images
  • call update-ca-certificates before connecting to gitlab
  • connect to gitlab using ssl_verify= GITLAB_CERTIFICATE_PATH

So with current solution, you still need to use the following pre_commands :

  - command: curl -L -o /usr/local/share/ca-certificates/RootCA.crt http://path.to.cert
    cwd: root
  - command: curl -L -o /usr/local/share/ca-certificates/IssueCA.crt http://path.to.cert
    cwd: root

What if I added something like:
if GITLAB_HTTP_PATH_TO_CERT
- curl -L -o /usr/local/share/ca-certificates/RootCA.crt GITLAB_HTTP_PATH_TO_CERT
- curl -L -o /usr/local/share/ca-certificates/RootCA.crt GITLAB_HTTP_PATH_TO_CERT
Would it be ok ?
Would we still need GITLAB_CERTIFICATE_PATH ?

Thanks !

@jberkers42
Copy link
Author

While I think this would work, I'm not 100% sure this is the right way.

We have our runners in a Kubernetes environment, and the right way there is to provide a "Secret" that is subsequently mounted as a file under /etc/ssl/certs. That would be the _right_way for kubernetes. When operating with Docker runners there would be a similar process where the runner instructs Docker to mount the certificate file at the same location. This method should scale for all other scenarios that require an internal CA or other custom certificate bundle to be provided. We already do this for the runner-helper that runs in Kubernetes, for it to properly validate the GitLab certificate.

I think the use of the GITLAB_CERTIFICATE_PATH possibly the best way to ensure ssl_verify is performed against the right set of certificates.

At the same time I understand that this may not work for everyone, so having a method to supply a certificate by other means is helpful. My initial method used a GitLab variable to simply pass the contents of the certificate file along to be written out by the GitLab pre_script. I did find that newlines were replaced with spaces in the variable, so had to do something to correct for that (I used sed). I had to hunt for a little bit to find somewhere to host the certificate file on a cleartext web service, so that may be a challenge for others also, in addition to adding a dependency to the environment.

Can you do conditional? If GITLAB_CERTIFICATE_PATH is provided, use that, if GITLAB_CUSTOM_CERTIFICATE is provided, write contents to a file, and use this file in ssl_verify.

What do you think? Let me know if I've been unclear on various points.

@nvuillam
Copy link
Member

nvuillam commented Feb 5, 2022

MegaLinter can do whatever it wants with ifs :)

            # Build gitlab options
            gitlab_options = {}
            # auth token
            if config.get("GITLAB_ACCESS_TOKEN_MEGALINTER", "") != "":
                gitlab_options.private_token = config.get(
                    "GITLAB_ACCESS_TOKEN_MEGALINTER"
                )
            else:
                gitlab_options.job_token = config.get("CI_JOB_TOKEN")
            # certificate management
            if config.get("GITLAB_CERTIFICATE_PATH", "") != "":
                run_command(
                    {"cwd": "root", "command": "update-ca-certificates"},
                    "GitlabCommentReporter",
                    self.master,
                )
                gitlab_options.ssl_verify = config.get("GITLAB_CERTIFICATE_PATH")
            # Create gitlab connection
            gl = gitlab.Gitlab(gitlab_server_url, gitlab_options)

Can i ask you to complete it with pseudo-code, then I'll adapt it ?

@jberkers42
Copy link
Author

jberkers42 commented Feb 6, 2022

My attempt at psuedo-code for this:

            # Build gitlab options
            gitlab_options = {}
            # auth token
            if config.get("GITLAB_ACCESS_TOKEN_MEGALINTER", "") != "":
                gitlab_options.private_token = config.get(
                    "GITLAB_ACCESS_TOKEN_MEGALINTER"
                )
            else:
                gitlab_options.job_token = config.get("CI_JOB_TOKEN")
            # certificate management
            if config.get("GITLAB_CERTIFICATE_PATH", "") != "":
                run_command(
                    {"cwd": "root", "command": "update-ca-certificates"},
                    "GitlabCommentReporter",
                    self.master,
                )
                gitlab_options.ssl_verify = config.get("GITLAB_CERTIFICATE_PATH")
            elseif config.get("GITLAB_CUSTOM_CERTIFICATE", "") != "":
              write contents to /etc/ssl/certs/gitlab-cert.crt
              gitlab_options.ssl_verify = "/etc/ssl/certs/gitlab-cert.crt"
            # Create gitlab connection
            gl = gitlab.Gitlab(gitlab_server_url, gitlab_options)

Hope that makes sense.

The command I had used to write the certificate from variable was:

$ echo $CUSTOM_CA_CERT | sed 's/ CERTIFICATE/#CERTIFICATE/g' | sed 's/ /\n/g' | sed 's/#/ /' >> /usr/local/share/ca-certificates/ipsec-ca.crt

Since the line-breaks in the certificate contents seem to get replaced with spaces, I had to put them back. I uses a '#' in the header as a temporary substitute so that it didn't get split.

@nvuillam
Copy link
Member

nvuillam commented Feb 6, 2022

@jberkers42 thanks for the detailed info :)

I updated the code this way, and also the reporter documentation

            # Certificate management
            gitlab_certificate_path = config.get("GITLAB_CERTIFICATE_PATH", "")
            if config.get("GITLAB_CUSTOM_CERTIFICATE", "") != "":
                # Certificate value defined in an ENV variable
                cert_value = config.get("GITLAB_CUSTOM_CERTIFICATE")
                gitlab_certificate_path = "/etc/ssl/certs/gitlab-cert.crt"
                with open(gitlab_certificate_path, "w", encoding="utf-8") as cert_file:
                    cert_file.write(cert_value)
                    logging.debug(
                        f"Updated {gitlab_certificate_path} with certificate value {cert_value}"
                    )
            if gitlab_certificate_path != "":
                # Update certificates and set cert path in gitlab options
                run_command(
                    {"cwd": "root", "command": "update-ca-certificates"},
                    "GitlabCommentReporter",
                    self.master,
                )
                gitlab_options.ssl_verify = gitlab_certificate_path
            # Create gitlab connection
            logging.debug(
                f"[GitlabCommentReporter] Logging to {gitlab_server_url} with {str(gitlab_options)}"
            )
            gl = gitlab.Gitlab(gitlab_server_url, gitlab_options)

Please can I ask you to test on your side with docker image megalinter/megalinter:test-nvuillam-gitlab-cert before I publish ? )

@jberkers42
Copy link
Author

I set the GITLAB_CUSTOM_CERTIFICATE variable, and tried it:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/local/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/local/lib/python3.9/site-packages/megalinter-0.1-py3.9.egg/megalinter/run.py", line 15, in <module>
    linter.run()
  File "/usr/local/lib/python3.9/site-packages/megalinter-0.1-py3.9.egg/megalinter/MegaLinter.py", line 172, in run
    reporter.produce_report()
  File "/usr/local/lib/python3.9/site-packages/megalinter-0.1-py3.9.egg/megalinter/reporters/GitlabCommentReporter.py", line 55, in produce_report
    gitlab_options.private_token = config.get(
AttributeError: 'dict' object has no attribute 'private_token'

@nvuillam
Copy link
Member

nvuillam commented Feb 6, 2022

basic python mistake... oops :)

Please can you try again with updated megalinter/megalinter:test-nvuillam-gitlab-cert ?

@jberkers42
Copy link
Author

jberkers42 commented Feb 6, 2022

Works much better now.

Thank you once again for your efforts.

I will probably do some more extensive tests tomorrow just to be sure, it's nearly midnight here.

@nvuillam
Copy link
Member

nvuillam commented Feb 6, 2022

That was a shared effort, thanks for helping MegaLinter being better :)

So without PRE_COMMANDS and with just GITLAB_ACCESS_TOKEN_MEGALINTER and GITLAB_CUSTOM_CERTIFICATE we're all good ? I think we can't do smaller custom config, that's great ^^

14h here ... I understand, good night :)

I'll probably have published in beta tomorrow, at worse if there are issues i'll make a new PR :)

@jberkers42
Copy link
Author

jberkers42 commented Feb 7, 2022

Just a quick update.

I have performed various tests, and am happy to report success on both modes of the functionality:

  • GITLAB_CUSTOM_CERTIFICATE
  • GITLAB_CERTIFICATE_PATH

Both work as advertised without any issues.

In my continued testing, I did encounter some issues with markdownlinkcheck that were related to certificates. I am currently using a GitLab CI before_script to do update-ca-certificates to fix this after providing the certificate bundle via Kubernetes. I made the following change to my gitlab-runner.yml helm chart (for other's reference):

runners:
  config:
    [[runners]]
      name = "name-goes-here"
      executor = "kubernetes"
      [runners.kubernetes]]
        [[runners.kubernetes.volumes.secret]]
          name = "customca"
          mount_path = "/usr/local/share/ca-certificates"
          read_only = true
          [runners.kubernetes.volumes.secret.items]
            "custom_ca.crt" = "custom_ca.crt"

To make use of the above, I have registered a secret with the same name in the namespace of the gitlab-runner containing the certificate.

kubectl create secret generic customca --namespace gitlabci --from-file=custom_ca.crt

Thanks again for your prompt attention and assistance with this.

@nvuillam
Copy link
Member

nvuillam commented Feb 7, 2022

Thanks for your tests and feedback !

Do you have internally hosted URLs that are tested by markdown-link-check ?

Note: you appear in the doc now haha ^^ -> https://megalinter.github.io/beta/reporters/GitlabCommentReporter/#special-thanks

@jberkers42
Copy link
Author

Yes, indeed.

In many of the CHANGELOG.md documents in various projects I have reference links to the repo, issues and releases, that all point back to out internal gitlab instance. Needless to say, if the certificate is not trusted, the link tests fail, but don't really tell me why they fail. When trying to fix the cert for the comment reporter, the link checks stopped failing.

@nvuillam
Copy link
Member

nvuillam commented Feb 7, 2022

markdown-link-check uses needle behind the scenes, and it seems it gets local system certificate info to perform the calls, that could explain why it works after your updates :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants