CentOS 7 웹 서버 VPS에 Bugzilla를 설치했습니다. 설치는 순조롭게 진행되었지만 이메일을 설정하려고 했더니 다음과 같은 오류가 발생했습니다.
Bugzilla/Config/Common.pm 라인 365에서 'Net::SMTP::SSL' 패키지를 통해 'quit' 개체 메서드를 찾을 수 없습니다.
도움이 필요하시면 사이트 관리자(********)에게 이 오류 메시지와 오류 발생 시간 및 날짜를 이메일로 보내주세요.
Office 365에 연결하도록 이메일 구성을 설정했습니다. 이는 다음을 의미합니다.
SMTP 서버: smtp.office365.com:587 smtp_ssl: 사용자 이름/비밀번호/mailfrom: 사용 중인 이메일 주소입니다.
문제의 소스 파일인 Config/Common.pm을 살펴보았습니다.
344
345 sub check_smtp_server {
346 my $host = shift;
347 my $port;
348
349 if ($host =~ /:/) {
350 ($host, $port) = split(/:/, $host, 2);
351 unless ($port && detaint_natural($port)) {
352 return "Invalid port. It must be an integer (typically 25, 465 or 587)";
353 }
354 }
355 trick_taint($host);
356 # Let's first try to connect using SSL. If this fails, we fall back to
357 # an unencrypted connection.
358 foreach my $method (['Net::SMTP::SSL', 465], ['Net::SMTP', 25]) {
359 my ($class, $default_port) = @$method;
360 next if $class eq 'Net::SMTP::SSL' && !Bugzilla->feature('smtp_ssl');
361 eval "require $class";
362 my $smtp = $class->new($host, Port => $port || $default_port, Timeout => 5);
363 if ($smtp) {
364 # The connection works!
365 $smtp->quit;
366 return '';
367 }
368 }
369 return "Cannot connect to $host" . ($port ? " using port $port" : "");
370 }
371
나는 연결 정보가 성공했고 Bugzilla가 연결을 종료하려고 시도했지만 오류 없이 반환되었다고 추론했습니다.
내가 찾은이것이 문제에 관한 인터넷 기사.
Thorsten Schoning씨는 다음과 같이 말했습니다.
그런 다음 추가로 디버그하십시오. 설치된 Net::SMTP::SSL 버전을 확인하고, 소스 코드에서 사용 가능한 "exit" 메소드가 있는지 확인하십시오. Perl이나 어떤 방식으로든 패키지가 설치된 위치에는 Net/SMTP/SSL.pm 파일이 설치되어 있어야 합니다. install-module.pl을 사용한 경우, bugzilla/lib 폴더를 비우고 패키지 관리자를 사용하여 누락된 패키지를 다시 설치하세요.
또한 언급된 Bugzilla 코드 줄을 보고 Bugzilla가 무엇을 생각하는지 확인하십시오. Net::SMTP::SSL을 사용할 수 있다고 생각하고 사용 가능한 메서드가 필요하지만 해당 메서드가 누락된 것 같습니다. 제가 이해한 바에 따르면 가능해야 하기 때문에 그 이유를 찾으셔야 합니다.
글쎄, 나는 locate
for를 만들고 SSL.pm
알아 냈습니다.
[root@tkts-wtsc /]# locate SSL.pm
/usr/lib64/perl5/vendor_perl/Net/SSL.pm
/usr/share/perl5/vendor_perl/HTTP/Daemon/SSL.pm
/usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
/usr/share/perl5/vendor_perl/Net/MQTT/Simple/SSL.pm
/usr/share/perl5/vendor_perl/Net/SMTP/SSL.pm
/usr/share/perl5/vendor_perl/Net/Server/Proto/SSL.pm
/usr/share/perl5/vendor_perl/Software/License/OpenSSL.pm
내용을 살펴보니 Net/SMTP/SSL.pm
서브루틴이 전혀 포함되어 있지 않습니다. 그러다가 내용을 보고 /Net/SSL.pm
서브루틴/메서드를 봤는데 하나도 없고 명령이 있어서 quit
별로 놀라지 않았습니다. Schoning 씨의 답변이 어떤 의미인지는 확실하지 않지만 그의 링크된 소스에도 방법이 포함되어 있지 않습니다 .quit
SMTP
SSL.pm
quit
나는 sudo yum install mod_ssl openssl
다른 곳에서 언급한 대로 했고 그것을 얻었다 already installed and latest version, nothing to do
.
하나 만들어서 sudo yum install perl-Net-SMTP-SSL
받았어요 Package perl-Net-SMTP-SSL-1.01-13.el7.noarch already installed and latest version
. 모든 패키지를 설치하고 모든 것을 업데이트했습니다.
이 질문은 프로그래밍 질문이 아닌 서버 설정 질문이므로 SO가 아닌 여기에 질문을 넣습니다. 오류가 언급했기 때문에 소스 파일을 언급했고 모든 세부 사항을 완전하게 제공하고 싶었습니다.
주요 폴더에 대한 권한을 설정했습니다.
drwxr-x--- 2 jmr-admin psacln 4096 Oct 17 08:33 Config
-rwxr-x--- 1 jmr-admin psacln 13547 Oct 16 16:55 Config.pm
폴더의 모든 항목 은 Config
다음과 같습니다.
-rwxr-x--- 1 jmr-admin psacln 16836 Oct 16 16:55 Common.pm
이제 이 질문을 쓰고 있으니 권한 문제는 아닌 것 같습니다. 모듈은 고사하고 모듈을 perl
찾았 기 SMTP
때문에 SSL
테스트는 성공했고 quit
연결을 시도했지만 Perl이 메서드를 찾을 수 없었기 때문입니다 quit
.
On
이 옵션을 켜긴 했지만 smtp_debug
자세한 내용은 얻지 못했습니다.
내가 찾은이것참고로 처음에는 잊어버렸던 SMTP 서버 필드에 포트를 포함하는 등 좋은 정보가 많이 있습니다. 불행히도 이 참조는 내 문제를 해결하지 못했습니다. 어쨌든 이 글은 Gmail에 관한 내용이므로 Gmail 계정도 사용해 보았습니다. 이렇게 하면 이 페이지의 정보를 정확하게 입력할 수 있습니다. 정보를 복사해서 붙여넣었습니다. 지연 없이 즉시 동일한 오류가 발생했습니다. Gmail이나 Office 365에서는 약간의 지연이 예상되었기 때문에 조금 이상합니다.
고쳐 쓰다
계속 검색하다가 발견했어요이것기사. 결과 sesstatus -b
는 입니다 SELinux status: disabled
. 이는 또 다른 문제일 수 있지만 이메일을 보낼 수 없는 것과는 아무런 관련이 없습니다. 어쨌든 이는 문제 해결에 좋은 것입니다. 아무튼 그런 게 있다는 걸 알게 됐어요 /var/log/httpd/error_log
. 파일 내용은 다음과 같습니다(시도할 때마다 반복됨).
[Thu Oct 17 09:17:22 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:17:22 2019] editparams.cgi: at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:17:22 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Odd number of elements in hash assignment at /usr/share/perl5/vendor_perl/IO/Socket/IP.pm line 336.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi: Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
[Thu Oct 17 09:23:07 2019] editparams.cgi: is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
[Thu Oct 17 09:23:07 2019] editparams.cgi: possibly with SSL_ca_file|SSL_ca_path for verification.
[Thu Oct 17 09:23:07 2019] editparams.cgi: If you really don't want to verify the certificate and keep the
[Thu Oct 17 09:23:07 2019] editparams.cgi: connection open to Man-In-The-Middle attacks please set
[Thu Oct 17 09:23:07 2019] editparams.cgi: SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi: at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
~
CentOS
이 로그에는 더 이상 사용되지 않는 설정을 수정하고 공격을 제한하는 또 다른 부차 작업이 있음을 보여 주지만 Main-In-The-Middle
이는 종료 방법이 존재하지 않는 문제와 밀접한 관련이 있는 것 같지 않습니다. 좀 더 연구해 봐야 겠습니다.
실제 오류는 362행입니다. 오류를 나타내려면 null/false를 반환해야 합니다. 362행이 실제로 성공한다면 이 quit
방법이 존재할 것이라고 확신합니다. 불행하게도 내 환경은 중단점을 설정하고 내용을 볼 수 있는 Visual Studio 아래에 있지 않습니다. 서버관리모드인데..
my $smtp = $class->new($host, Port => $port || $default_port, Timeout => 5);
알았어 알아냈어이것SSL_VERIFY_NONE
기사를 통해 경고를 해결하는 데 도움이 되었습니다 . 나는 /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
명령을 연 vi
다음 :set number
명령을 실행하여 /DEFAULT_SSL_ARGS
35행으로 이동했습니다. 그런 다음 49행에서 에서 SSL_verify_mode => SSL_VERIFY_NONE,
로 변경했습니다 SSL_verify_mode => SSL_VERIFY_PEER,
. 그런 다음 변경 사항을 저장하고 종료했습니다. 이메일 설정을 다시 시도했는데 훨씬 더 잘 작동했습니다.
[root@tkts-wtsc Config]# vi /var/log/httpd/error_log
[root@tkts-wtsc Config]#
[Thu Oct 17 09:23:07 2019] editparams.cgi: possibly with SSL_ca_file|SSL_ca_path for verification.
[Thu Oct 17 09:23:07 2019] editparams.cgi: If you really don't want to verify the certificate and keep the
[Thu Oct 17 09:23:07 2019] editparams.cgi: connection open to Man-In-The-Middle attacks please set
[Thu Oct 17 09:23:07 2019] editparams.cgi: SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
[Thu Oct 17 09:23:07 2019] editparams.cgi: *******************************************************************
[Thu Oct 17 09:23:07 2019] editparams.cgi: at Bugzilla/Config/Common.pm line 362.
[Thu Oct 17 09:23:07 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
[Thu Oct 17 11:19:04 2019] editparams.cgi: Odd number of elements in hash assignment at /usr/share/perl5/vendor_perl/IO/Socket/IP.pm line 336.
[Thu Oct 17 11:19:04 2019] editparams.cgi: Can't locate object method "quit" via package "Net::SMTP::SSL" at Bugzilla/Config/Common.pm line 365.
~
이제 딱 두줄 남았네요. 흥미롭게도 362행에 대한 불만 사항은 더 이상 접수되지 않습니다. 음.
IP.pm
궁금한 사람이 있다면 336행의 코드를 참조하세요.
[root@tkts-wtsc Config]# vi /usr/share/perl5/vendor_perl/IO/Socket/IP.pm
[root@tkts-wtsc Config]#
325
326 As a special case, if the constructor is passed a single argument (as
327 opposed to an even-sized list of key/value pairs), it is taken to be the value
328 of the C<PeerAddr> parameter. This is parsed in the same way, according to the
329 behaviour given in the C<PeerHost> AND C<LocalHost> PARSING section below.
330
331 =cut
332
333 sub new
334 {
335 my $class = shift;
336 my %arg = (@_ == 1) ? (PeerHost => $_[0]) : @_;
337 return $class->SUPER::new(%arg);
338 }
339
(질문이 길어서 죄송합니다. 메모하는 것과 비슷하지만 다른 사람들도 이 모든 정보와 제가 사용한 방법으로부터 혜택을 받을 수 있기를 바랍니다. 실제로는 아무것도 아니며, 이 오류가 발생하면 다른 사람도 혜택을 받을 것입니다. )
어쨌든, 이 문제를 어떻게 해결해야 할까요?
답변1
이 질문은 지원 메일링 목록에 있으므로 완전성을 위해 여기에 답변을 추가하고 다른 모든 내용은 거기에서 논의하는 것이 좋습니다.
https://groups.google.com/d/msg/mozilla.support.bugzilla/ctvU6urNN0s/oj90IeduEAAJ
Bugzilla/Config/Common.pm 라인 365에서 'Net::SMTP::SSL' 패키지를 통해 'quit' 개체 메서드를 찾을 수 없습니다.
이 문제와 Office365라는 두 가지 다른 문제가 있는 것 같습니다. StackExchange에 연결한 과거 스레드를 확인하세요.
https://support-bugzilla.mozilla.narkive.com/ULqK5oBb/error-while-smtp-setup
몇몇 작성자는 Perl 모듈을 다시 설치한 후 문제가 사라졌다고 응답했습니다. 내 경험에 따르면 첫 번째 문제는 실제로 openssl-dev 등과 같은 종속성이 누락되어 발생합니다.
따라서 install-module.pl을 사용하여 Perl 종속성을 설치한 경우 Bugzilla의 lib 폴더를 비운 다음 배포판의 패키지 관리자를 사용하여 종속성을 다시 설치하세요. SSL과 관련된 추가 종속성을 제공할 가능성이 높습니다. 실제로 CPAN을 통해서만 사용할 수 있는 경우 install-module.pl은 마지막 단계일 뿐입니다. 이 경우 openssl-dev와 같은 다른 종속성을 충족하기 위해 패키지 관리자를 수동으로 사용해야 할 수도 있습니다.
Net/SMTP/SSL.pm의 내용을 살펴보니 서브루틴이 전혀 포함되어 있지 않습니다.
컴파일 타임에 자동으로 가져오기 때문에 이름 자체를 찾을 수 없습니다. 그러나 나는 작업 환경에서 결국에는 "종료"할 수 있는 능력을 갖게 될 것이라고 어느 정도 확신합니다. 물론 과거에는 더 명확했어야 했습니다. 다음 코드가 중요합니다.
no strict 'refs';
foreach ( keys %Net::SMTP:: ) {
next unless (ref(\$Net::SMTP::{$_}) eq "GLOB" && defined(*{$Net::SMTP::{$_}}{CODE}))
|| ref(\$Net::SMTP::{$_}) eq "REF";
*{$_} = \&{"Net::SMTP::$_"};
}
https://fastapi.metacpan.org/source/RJBS/Net-SMTP-SSL-1.03/lib/Net/SMTP/SSL.pm
그런 다음 /Net/SSL.pm의 내용을 보고 서브루틴/메소드를 보았지만 그 중 아무 것도 종료되지 않았지만 종료는 SMTP 명령이므로 이에 놀라지 않았습니다.
Net::SMTP에는 Net::SSL이 아닌 "quit"이 포함되어 있으며 위 코드로 가져옵니다.
quit() QUIT 명령을 원격 SMTP 서버에 보내고 소켓 연결을 닫습니다.
https://perldoc.perl.org/Net/SMTP.html
Office 365에 연결하도록 이메일 구성을 설정했습니다. 이는 다음을 의미합니다.
Office 365는 현재 OOB를 수행할 수 없으며 지원 메일링 목록에는 이 주제에 대한 스레드가 가득합니다.
https://bugzilla.mozilla.org/show_bug.cgi?id=1182445 https://groups.google.com/d/msg/mozilla.support.bugzilla/xFqK7S3h25g/6KI4Fg1NAAAJ https://groups.google.com/d/msg/mozilla.support.bugzilla/xFqK7S3h25g/JF52kHGWEQAJ
여러 해결 방법 중에서 원하는 방법만 선택하거나 Office 365를 전혀 사용하지 않을 수 있습니다. 저는 Bugzilla를 사용자 정의하는 것을 별로 좋아하지 않으며 메일을 Office 365로 전달하는 데 로컬 sendmail이나 이와 유사한 것을 선호합니다. 그러나 그것은 궁극적으로 당신에게 달려 있습니다.
SMTP 서버: smtp.office365.com:587 smtp_ssl: 열기
나는 smtp_ssl이 실제로 SSL이고 Office 365에서 요구하는 TLS가 아니라고 확신합니다. 따라서 Bugzilla가 365를 지원하더라도 이 구성은 작동하지 않을 가능성이 높습니다.
웹 호스팅 제공업체인 Media Temple에 연락했는데 그들은 매우 비전문적이었고 도움을 주는 것을 고려조차 거부했습니다.
첫 번째 오류 메시지의 SSL 종속성을 제외하면 어쨌든 실제로 도움이 되지 않습니다. Office 365에 대한 지원은 Bugzilla로 구현하거나 다른 기본 MTA를 사용하여 해결해야 합니다.
답변2
Schoning 씨의 대답은 틀린 것이 아니었고 나를 해결책으로 이끌었습니다. 기본적으로 특정 오류에 대해 작성자가 다음 명령을 실행해야 한다고 말한 아래 링크의 마지막 응답을 보지 못했을 것입니다. 나는 명령을 실행했고 곧 이메일이 즉시 성공했습니다.
협회궁금한 다른 고객님께
문제를 해결하기 위해 "cpan 업그레이드 Net::SMTP::SSL" 명령을 사용해 주셔서 감사합니다.
다른 사람들과 미래의 나를 위해 몇 가지 사항을 설명하겠습니다.
그러나 그때까지는 Bugzilla가 작동하더라도(UI가 훌륭하고 사용자, 프로젝트 등을 추가하는 기능) ./testserver.pl 스크립트가 여전히 실패하고 padlock.png를 읽을 수 없습니다.
기능 요청
- "테마" 지원이 없습니다. 그레이는 지루해요. 또한 업그레이드도 더 간단해져야 합니다.
- Plesk처럼 버튼 하나만 누르면 자동 업데이트나 소프트웨어 업데이트를 상상할 수 있습니다.
써봐
일이 어떻게 진행되고 있는지에 대한 오해가 있었고 처음에는 공식 Bugzilla 문서를 따랐음에도 불구하고(나중에 그렇게 했습니다) 문서는 여전히 불완전하고 내 환경에 적용할 수 없었습니다. 또한 로컬 프로필에는 ./localconfig
사용할 그룹뿐만 아니라 사용자 필드도 없습니다.
계속하기 전에 내 환경은 다음과 같습니다.
- VPS에서 Plesk Obsidian을 실행하는 CentOS 7(Media Temple에서는 "DV"라고 함)
문서에는 HTTPD 사용자와 그룹이 모두 "apache"라고 명시되어 있습니다 HTTPD configuration
. /etc/httpd/httpd.conf
이것은 또한 Bugzilla 문서에서 ./localconfig
파일에 사용하라고 말하는 것입니다! 안타깝게도 이것은 잘못된 것입니다. 정답은 "psacln"
그룹용입니다. 이 문제를 해결하는 가장 좋은 방법은 새 임시 하위 도메인을 만들고 기본 파일의 소유자와 그룹을 보는 것입니다. 내 경우 대답은 "jmr-admin:psacln"이었습니다. psacln
그룹 정책은 Bugzilla 구성 파일에 배치하여 처리할 수 있습니다. 이는 Apache에 대한 두 가지 변경 사항이 다음과 같다는 것을 의미합니다.
# If you set this to anything other than "", you will need to run checksetup.pl
# as root or as a user who is a member of the specified group.
$webservergroup = 'psacln';
# If set to 1, checksetup.pl will set file permissions so that Bugzilla
# works in a SuexecUserGroup environment.
$use_suexec = 1;
다시 실행한 후 사용자를 "root"에서 "jmr-admin"으로 수동으로 변경해야 했습니다 ./checksetup.pl
.
직접적인 변경 사항은 없습니다 /etc/httpd/httpd.conf
. 파일을 덮어쓰게 되므로 어느 플랫폼에서나 누구도 해당 파일을 변경해서는 안 됩니다. 있는 경우 사용자 정의 구성 파일을 생성하여 /etc/httpd/conf.d/
디렉터리에 배치합니다. httpd 구성 파일은 httpd.conf
자동으로 이 디렉터리를 읽습니다. 내 경우에는 뭔가를 추가하는 것이 잘못되어 상황이 엉망이 되었습니다. 해야 할 올바른 일은 다음 두 가지 중 하나입니다.
1) (가장 좋은 방법): .htaccess
파일을 추가하고 내용을 다음과 같이 설정합니다.
#CGI
DirectoryIndex index.cgi
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
Options +ExecCGI
#
2) Plesk 내부의 도메인(또는 내 경우에는 하위 도메인) 환경을 편집합니다. 예: [domain] Apache & nginx Settings
>>
핸들러: 맞춤 값 입력
cgi 스크립트.cgi cgi 스크립트.pl
인덱스 파일: 사용자 정의 값 입력(기본값 그대로 유지)
참고: 이를 사용하면 " "를 생략할 수 있지만 Options +ExecCGI
이는 불필요해 보입니다.
CGI를 확인하는 가장 좋은 방법은 새로운 테스트 하위 도메인을 만들고 cgi 스크립트를 루트 디렉터리(예: 광산)에 배치하는 것입니다 testcgi2.cgi
.
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
Apache 변경 사항이 정상이면 스크립트는 코드 없이 다음과 같은 형식의 텍스트를 표시합니다.
안녕하세요 단어! 이것은 내 첫 번째 CGI 프로그램입니다.
그런 다음 다운로드한 zip 파일의 파일을 하위 도메인에 복사했습니다. 추가 키 파일의 권한을 755로 설정해야 할 수도 있습니다.
CentOS 7 및 Bugzilla 문서에 표시된 대로 yum 명령을 실행해야 했습니다.
종료 방법이 누락되는 성가신 문제가 발생하지 않도록 SMTP가 제대로 작동하도록 하려면 추가 스크립트를 실행해야 합니다.
나는 원본 Bugzilla 문서를 보았고 처음에는 중국어가 읽기 더 쉬울 것이라고 생각했습니다. 적어도 쇼군(Shogun) 미니시리즈를 TV에서 봤거든요. 비록 일본어였지만요. 웹 호스팅 제공업체에 연락했더니 Bugzilla CentOS 7 가이드에 대한 링크를 제공했습니다.
이것은 Plesk나 제가 말하는 변경 사항이나 권한에 대해 논의하지 않기 때문에 불완전합니다. 며칠간의 고통 끝에 Bugzilla 문서는 이제 중국어보다는 영어와 비슷해 보이지만 여전히 작업이 완료되지 않습니다. 사이트 오픈을 볼 수 있도록 처음에는 웹 호스팅 제공업체에 변경을 요청하는 것이 좋았을 수도 있지만, 설명 부족과 현재 지식 부족으로 인해 다음 사이트 운영 시에는 모두 망할 뻔했습니다. 제대로 작동할 수 없습니다. ./checksetup.pl
스크립트.
나는 그것이 모든 것을 다루고 있다고 생각합니다. 어쨌든 아직 전문가는 아니지만 제 글이 도움이 되었으면 좋겠습니다.